Это может быть поздно, но я столкнулся с чем-то, что объясняет вашу озабоченность, связанную с прокси-сервером (будут перехватываться только внешние вызовы методов, поступающие через прокси-сервер).
Например, у вас есть класс, который выглядит следующим образом
@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);
}
}
Результаты вызова kickOff выше указанного кода выше.
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/