2012-05-27 3 views
0

메소드의 모든 실행과 일치하는 pointcut을 작성하여 혼란 스럽습니다. 내 충고는 -instance 메인 프로그램이 BetaalphaMethod를 호출하면 다음과 같은 클래스 hierachy상속을 통한 pointcut 혼란

public class Alpha { 
    public void alphaMethod() {...} 
} 
public class Beta extends Alpha { 
    public void betaMethod() { 
     alphaMethod(); 
    } 
} 

execution(* Alpha.*(..)) 

: 나는 클래스 Alpha의 모든 메소드 실행을 일치해야합니다 포인트 컷을 시도 예상했던대로 호출하지만 Main 프로그램은 betaMethod을 호출하여 내 조언에 alphaMethod이라는 콜을 호출하지 않으며 그 이유를 이해하지 못합니다.

화면-정의 :

@Aspect 
public class MyAspect { 
    @Before(value = "execution(* Alpha.*(..))", argNames="joinPoint") 
    public void myAdvice(JoinPoint joinPoint) { 
     System.out.println("BEFORE: " + joinPoint.getSignature()); 
    } 
} 

홈페이지-방법이 예상되는

Beta beta = ...; 
beta.alphaMethod(); //advice is called 
beta.betaMethod(); //advice is NOT called. 

답변

1

.

봄 AOP는 권고 된 빈을 랩핑하기 위해 프록시 클래스를 사용합니다. Beta 메서드 내에서 alphaMethod()을 호출하면 프록시가이를 인식하지 못합니다.

자세한 내용은 this 답변을 참조하십시오.

+0

이 문제는 여전히 예상되지만 프록시를 사용하면이 문제가 발생합니다. 고마워! – thomas

+0

@darrengorman은 상속 된 메소드를 포함하도록 Spring에 알려줄 수있는 방법이 있습니까? –

1

이미 답변 한 것처럼 분명합니다. 당신은 프록시를 대신 로딩 시간을 사용하여이 문제를 해결할 수 있습니다. (어딘가에 AspectJ에 대한 설정 옵션과 어 스펙트가 이미 존재하지 않는다면 의존 옵션으로) 또는 의존성으로 자체에 빈을 주입 한 다음 프록시를 사용하는 대신에 전자는 프록시에 대한 참조 인,

public void betaMethod() { 
    selfBean.alphaMethod(); 
} 

selfBeanthis는 동일한 참조되지 않기 때문에이 작동을 구현 원래 프록시 객체에 대한 참조 후자.

+0

예, 'selfBean' 참조를 사용하면 도움이 될 것입니다. 그러나 제가 관심이없는 해결 방법입니다. 그러나 나는 직조 설정에 대해 자세히 살펴볼 것입니다. 감사! – thomas