Mungkin terlambat tapi saya menemukan sesuatu yang menjelaskan kekhawatiran Anda terkait dengan proxy (hanya panggilan metode 'eksternal' yang masuk melalui proxy yang akan dicegat) dengan baik.
Misalnya, Anda memiliki kelas yang terlihat seperti ini
@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");
}
}
dan Anda memiliki aspek, yang terlihat seperti ini:
@Component
@Aspect
public class CrossCuttingConcern {
@Before("execution(* com.intertech.CoreBusinessSubordinate.*(..))")
public void doCrossCutStuff(){
System.out.println("Doing the cross cutting concern now");
}
}
Ketika Anda menjalankannya seperti ini:
@Service
public class CoreBusinessKickOff {
@Autowired
CoreBusinessSubordinate subordinate;
// getter/setters
public void kickOff() {
System.out.println("I do something big");
subordinate.doSomethingBig();
subordinate.doSomethingSmall(4);
}
}
Hasil pemanggilan kickOff di atas diberikan kode di atas.
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
tetapi ketika Anda mengubah kode Anda ke
@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);
}
Anda lihat, metode ini memanggil metode lain secara internal sehingga tidak akan dicegat dan hasilnya akan terlihat seperti ini:
I do something big
Doing the cross cutting concern now
I did something small
I also do something small but with an int
Anda dapat melewati ini dengan melakukan itu
public void doSomethingBig() {
System.out.println("I did something small");
//doSomethingSmall(4);
((CoreBusinessSubordinate) AopContext.currentProxy()).doSomethingSmall(4);
}
Cuplikan kode diambil dari:
https://www.intertech.com/Blog/secrets-of-the-spring-aop-proxy/