늦었을 수도 있지만 프록시와 관련된 문제를 설명하는 무언가를 발견했습니다 (프록시를 통해 들어오는 '외부'메소드 호출 만 차단됩니다).
예를 들어 다음과 같은 클래스가 있습니다.
@Component("mySubordinate")
public class CoreBusinessSubordinate {
public void doSomethingBig() {
System.out.println("I did something small");
}
public void doSomethingSmall(int x){
System.out.println("I also do something small but with an int");
}
}
그리고 당신은 다음과 같은 양상을 가지고 있습니다 :
@Component
@Aspect
public class CrossCuttingConcern {
@Before("execution(* com.intertech.CoreBusinessSubordinate.*(..))")
public void doCrossCutStuff(){
System.out.println("Doing the cross cutting concern now");
}
}
다음과 같이 실행할 때 :
@Service
public class CoreBusinessKickOff {
@Autowired
CoreBusinessSubordinate subordinate;
// getter/setters
public void kickOff() {
System.out.println("I do something big");
subordinate.doSomethingBig();
subordinate.doSomethingSmall(4);
}
}
위 코드에서 킥오프를 호출 한 결과.
I do something big
Doing the cross cutting concern now
I did something small
Doing the cross cutting concern now
I also do something small but with an int
그러나 코드를 다음과 같이 변경하면
@Component("mySubordinate")
public class CoreBusinessSubordinate {
public void doSomethingBig() {
System.out.println("I did something small");
doSomethingSmall(4);
}
public void doSomethingSmall(int x){
System.out.println("I also do something small but with an int");
}
}
public void kickOff() {
System.out.println("I do something big");
subordinate.doSomethingBig();
//subordinate.doSomethingSmall(4);
}
보시다시피, 메소드는 내부적으로 다른 메소드를 호출하므로 인터셉트되지 않으며 출력은 다음과 같습니다.
I do something big
Doing the cross cutting concern now
I did something small
I also do something small but with an int
그렇게함으로써 우회 할 수 있습니다
public void doSomethingBig() {
System.out.println("I did something small");
//doSomethingSmall(4);
((CoreBusinessSubordinate) AopContext.currentProxy()).doSomethingSmall(4);
}
https://www.intertech.com/Blog/secrets-of-the-spring-aop-proxy/ 에서 가져온 코드 스 니펫