2013-05-11 2 views
0

저는 pointcuts 표현식을 사용하는 방법을 조언하는 데 정말로 문제가 있습니다.@Pointcut 표현식을 어떻게 작동시킬 수 있습니까?

봄 내가 원하는 3.1.2.RELEASE

의 pom.xml

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>1.7.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>1.7.2</version> 
    </dependency> 

servlet.xml에

<aop:aspectj-autoproxy/> 

클래스 : 나는 다음과 같은 구성을 가지고 조언에

@Repository(value="userDaoImpl") 
@Transactional 
public class UserDaoImpl implements UserDao{ 

    //attributes and methods 

    @Override 
    public void delete(ProfiledUser user) throws HibernateException 
    { 
     sessionFactory.getCurrentSession().delete(user);   
    } 
} 

그것은

여기에 작동하지 않습니다 내 조언

@Aspect 
@Component("userDeletionAspect") 
public class UserDeletionAspect { 

    @Pointcut("execution(public void aa.bb.cc.dd.UserDaoImpl.delete(..))") 
    public void objectDeletionPointcut(){} 

    @Before("objectDeletionPointcut()") 
    public void notifyDeletion(JoinPoint jp) 
    {  
     System.out.println("pointcut executed"); 
    } 
} 

GenericDao<T> 인터페이스를 확장 UserDao 인터페이스을 구현합니다. 이것은 UserDaoImpl의 delete 메소드가 실행될 때 전혀 인터셉트되지 않는다는 것을 의미합니다.

@Pointcut("execution(* aa.bb.cc.dd.GenericDao.delete(..))") 

하지만 아무것도 변경 : 봄 문서에서

는 그 봄의 프록시 그래서 다음과 같이 포인트 컷 정의를 변경하려 인터페이스일을 참조하십시오. UserDaoImpl 클래스의 .delete() 방법을 가로채는 방법은 무엇입니까? 당신은 당신의 pointcut 표현에 구체적인 클래스 또는 특정 인터페이스의 구현 중 하나를 타겟팅 할 수 있습니다 -

+0

중복 'objectDeletionPointcut'질문에서를 제거하십시오) –

+0

@MarkusCoetzee는 아직도 그() 메소드를 삭제 가로 챌 수없는 제안으로도 코드를 변경, 불행하게도 :-) – MaVVamaldo

답변

1

당신은

<aop:aspectj-autoproxy> 
    <aop:include name="userDeletionAspect"/> 
</aop:aspectj-autoproxy> 

대신 참고

<aop:aspectj-autoproxy/> 

해야합니다.

Spring은 public 메소드만을 대상으로 할 수 있으므로 pointcut 표현식에서 'public'부분을 제거 할 수 있습니다. 또한, 당신이 원하는 경우에 당신은 너무 같은 pointcut 표현과 함께 조언을 선언 할 수

@Before("execution(void aa.bb.cc.dd.UserDaoImpl.delete(..))") 
public void notifyDeletion(JoinPoint jp) {  
    System.out.println("pointcut executed"); 
} 

이제 갈 좋은,하지만 여전히 몇 가지 문제가 발생하는 경우, 여기 스프링 AOP를 사용하여 간단한 로깅 예제한다 - logging with AOP in spring?

+0

을 수행. Dao 클래스 수준에서 @Trasactional 주석을 사용하므로 모든 delete 메소드가 TransactionInterceptor 클래스에 의해 이미 프록시 처리됩니다. 나의 차단 시도에 영향을 미칠 수 있습니까? – MaVVamaldo

+1

트랜잭션 주석을 추가해도 문제가 발생하지 않습니다. 내 봄 MVC 응용 프로그램에서 @Transactional 주석이 내 컨트롤러에서 일부 조언을 대상으로 성공적으로. 첫째, 'servlet.xml'이 애플리케이션 컨텍스트입니까?두 번째로, UserDeletionAspect 클래스의 패키지를 스캔하여 Bean으로 컨테이너에 추가 할 수 있도록 Spring을 구성 했습니까? –

+0

빙고! My Dao 클래스는 @Repository 스테레오 타입으로 주석을 달았고 ... 그들은 작업을했기 때문에 어떻게 든 컨테이너에 등록되었다고 생각했습니다. AOP에는 충분하지 않은 것 같습니다. 나는''를 추가했으며 모든 것은 매력처럼 작동한다. 나는이 수업들이 두 번 등록 될 것이라는 것에 조금 걱정하고있다. – MaVVamaldo

관련 문제