Es mag spät sein, aber ich bin auf etwas gestoßen, das Ihre Bedenken in Bezug auf den Proxy erklärt (nur "externe" Methodenaufrufe, die über den Proxy eingehen, werden abgefangen).
Zum Beispiel haben Sie eine Klasse, die so aussieht
@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");
}
}
und Sie haben einen Aspekt, der so aussieht:
@Component
@Aspect
public class CrossCuttingConcern {
@Before("execution(* com.intertech.CoreBusinessSubordinate.*(..))")
public void doCrossCutStuff(){
System.out.println("Doing the cross cutting concern now");
}
}
Wenn Sie es so ausführen:
@Service
public class CoreBusinessKickOff {
@Autowired
CoreBusinessSubordinate subordinate;
// getter/setters
public void kickOff() {
System.out.println("I do something big");
subordinate.doSomethingBig();
subordinate.doSomethingSmall(4);
}
}}
Ergebnisse des Aufrufs von kickOff über dem oben angegebenen Code.
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
aber wenn Sie Ihren Code ändern
@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);
}
Sie sehen, die Methode ruft intern eine andere Methode auf, damit sie nicht abgefangen wird und die Ausgabe folgendermaßen aussehen würde:
I do something big
Doing the cross cutting concern now
I did something small
I also do something small but with an int
Sie können dies umgehen, indem Sie dies tun
public void doSomethingBig() {
System.out.println("I did something small");
//doSomethingSmall(4);
((CoreBusinessSubordinate) AopContext.currentProxy()).doSomethingSmall(4);
}
Code-Schnipsel aus:
https://www.intertech.com/Blog/secrets-of-the-spring-aop-proxy/