Có thể đã muộn nhưng tôi đã bắt gặp điều gì đó giải thích mối quan tâm của bạn liên quan đến proxy (chỉ các cuộc gọi phương thức 'bên ngoài' đến qua proxy sẽ bị chặn) một cách độc đáo.
Ví dụ, bạn có một lớp trông như thế này
@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");
}
}
và bạn có một khía cạnh, trông như thế này:
@Component
@Aspect
public class CrossCuttingConcern {
@Before("execution(* com.intertech.CoreBusinessSubordinate.*(..))")
public void doCrossCutStuff(){
System.out.println("Doing the cross cutting concern now");
}
}
Khi bạn thực hiện nó như thế này:
@Service
public class CoreBusinessKickOff {
@Autowired
CoreBusinessSubordinate subordinate;
// getter/setters
public void kickOff() {
System.out.println("I do something big");
subordinate.doSomethingBig();
subordinate.doSomethingSmall(4);
}
}
Kết quả của việc gọi kick Offer ở trên mã đã cho ở trên.
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
nhưng khi bạn thay đổi mã của bạn thành
@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);
}
Bạn thấy đấy, phương thức bên trong gọi một phương thức khác để nó không bị chặn và đầu ra sẽ như thế này:
I do something big
Doing the cross cutting concern now
I did something small
I also do something small but with an int
Bạn có thể vượt qua điều này bằng cách làm điều đó
public void doSomethingBig() {
System.out.println("I did something small");
//doSomethingSmall(4);
((CoreBusinessSubordinate) AopContext.currentProxy()).doSomethingSmall(4);
}
Đoạn mã được lấy từ:
https://www.intertech.com/Blog/secrets-of-the-spring-aop-proxy/