यह देर हो सकती है लेकिन मुझे कुछ ऐसा मिला है जो प्रॉक्सी से संबंधित आपकी चिंता की व्याख्या करता है (केवल प्रॉक्सी के माध्यम से आने वाली 'बाहरी' विधि कॉलों को इंटरसेप्ट किया जाएगा)।
उदाहरण के लिए, आपके पास एक वर्ग है जो इस तरह दिखता है
@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");
}
}
और आपके पास एक पहलू है, जो इस तरह दिखता है:
@Component
@Aspect
public class CrossCuttingConcern {
@Before("execution(* com.intertech.CoreBusinessSubordinate.*(..))")
public void doCrossCutStuff(){
System.out.println("Doing the cross cutting concern now");
}
}
जब आप इसे इस तरह निष्पादित करते हैं:
@Service
public class CoreBusinessKickOff {
@Autowired
CoreBusinessSubordinate subordinate;
// getter/setters
public void kickOff() {
System.out.println("I do something big");
subordinate.doSomethingBig();
subordinate.doSomethingSmall(4);
}
}
ऊपर दिए गए कोड से किकऑफ कॉल करने के परिणाम।
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
लेकिन जब आप अपना कोड बदलेंगे
@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);
}
आप देखते हैं, विधि आंतरिक रूप से किसी अन्य विधि को कॉल करती है, इसलिए इसे इंटरसेप्ट नहीं किया जाएगा और आउटपुट इस तरह दिखेगा:
I do something big
Doing the cross cutting concern now
I did something small
I also do something small but with an int
आप ऐसा करके इसे पास कर सकते हैं
public void doSomethingBig() {
System.out.println("I did something small");
//doSomethingSmall(4);
((CoreBusinessSubordinate) AopContext.currentProxy()).doSomethingSmall(4);
}
कोड स्निपेट से लिया गया:
https://www.intertech.com/Blog/secrets-of-the-spring-aop-proc/