Potrebbe essere tardi, ma mi sono imbattuto in qualcosa che spiega la tua preoccupazione relativa al proxy (verranno intercettate solo le chiamate di metodo "esterne" che arrivano attraverso il proxy).
Ad esempio, hai una classe simile a questa
@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");
}
}
e hai un aspetto simile a questo:
@Component
@Aspect
public class CrossCuttingConcern {
@Before("execution(* com.intertech.CoreBusinessSubordinate.*(..))")
public void doCrossCutStuff(){
System.out.println("Doing the cross cutting concern now");
}
}
Quando lo esegui in questo modo:
@Service
public class CoreBusinessKickOff {
@Autowired
CoreBusinessSubordinate subordinate;
// getter/setters
public void kickOff() {
System.out.println("I do something big");
subordinate.doSomethingBig();
subordinate.doSomethingSmall(4);
}
}
Risultati della chiamata di kickOff sopra il codice sopra indicato.
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
ma quando cambi il codice in
@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);
}
Vedete, il metodo chiama internamente un altro metodo in modo che non venga intercettato e l'output sarà simile al seguente:
I do something big
Doing the cross cutting concern now
I did something small
I also do something small but with an int
Puoi aggirare ciò facendo quello
public void doSomethingBig() {
System.out.println("I did something small");
//doSomethingSmall(4);
((CoreBusinessSubordinate) AopContext.currentProxy()).doSomethingSmall(4);
}
Frammenti di codice tratti da:
https://www.intertech.com/Blog/secrets-of-the-spring-aop-proxy/