Il est peut-être tard, mais je suis tombé sur quelque chose qui explique bien votre préoccupation liée au proxy (seuls les appels de méthode «externes» entrant via le proxy seront interceptés).
Par exemple, vous avez une classe qui ressemble à ceci
@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");
}
}
et vous avez un aspect qui ressemble à ceci:
@Component
@Aspect
public class CrossCuttingConcern {
@Before("execution(* com.intertech.CoreBusinessSubordinate.*(..))")
public void doCrossCutStuff(){
System.out.println("Doing the cross cutting concern now");
}
}
Lorsque vous l'exécutez comme ceci:
@Service
public class CoreBusinessKickOff {
@Autowired
CoreBusinessSubordinate subordinate;
// getter/setters
public void kickOff() {
System.out.println("I do something big");
subordinate.doSomethingBig();
subordinate.doSomethingSmall(4);
}
}
Résultats de l'appel de kickOff au-dessus du code donné ci-dessus.
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
mais quand vous changez votre code en
@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);
}
Vous voyez, la méthode appelle en interne une autre méthode afin qu'elle ne soit pas interceptée et la sortie ressemblerait à ceci:
I do something big
Doing the cross cutting concern now
I did something small
I also do something small but with an int
Vous pouvez contourner cela en faisant cela
public void doSomethingBig() {
System.out.println("I did something small");
//doSomethingSmall(4);
((CoreBusinessSubordinate) AopContext.currentProxy()).doSomethingSmall(4);
}
Extraits de code extraits de:
https://www.intertech.com/Blog/secrets-of-the-spring-aop-proxy/