मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं इसके बीच एक महत्वपूर्ण अंतर आया और AspectJ का उपयोग नहीं करते समय लक्ष्य बना दिया।
निम्नलिखित परिचय पहलू पर विचार करें:
@Aspect
public class IntroductionsAspect {
@DeclareParents(value="a.b.c.D", defaultImpl=XImpl.class)
public static X x;
@After("execution(* a.b.c.D.*(..)) && this(traceable)")
public void x(Traceable traceable) {
traceable.increment();
}
}
सीधे शब्दों में कहें, इस पहलू दो बातें कर रही है: a.b.c.D
वर्ग X
इंटरफ़ेस को लागू करना
- ।
a.b.c.D
की प्रत्येक विधि से पहले निष्पादित करने के लिए traceable.increment()
पर कॉल जोड़ना।
महत्वपूर्ण हिस्सा "execution(* a.b.c.D.*(..)) && this(traceable)"
है। ध्यान दें कि मैंने का उपयोग किया, लक्ष्य।
आप लक्ष्य बजाय का उपयोग करते हैं, आप मूल वर्ग a.b.c.D
, नहीं शुरू की इंटरफ़ेस X
मिलान करने के लिए कोशिश कर रहे हैं। तो वसंत एओपी को a.b.c.D
में कोई भी शामिल बिंदु नहीं मिलेगा।
सारांश में:
इस - प्रॉक्सी प्रकार, या शुरू की प्रकार की जांच करता है। लक्ष्य - घोषित प्रकार की जांच करता है।
अगर मैं तुम्हें सही मिलता है ... दोनों 'this' और' target' एक ही बात करते हैं ??? एक बार मेरा कोड 'खाता सेवा' की कुछ विधि निष्पादित करने का प्रयास करता है, फिर रिसीवर बिंदु दृश्य से, 'खाता सेवा' का यह उदाहरण सत्य है; और कॉलर पॉइंट व्यू से 'जिसे ऑब्जेक्ट उदाहरण खाताधारक' कहा जाता है, भी सच है। तो यह अनावश्यकता क्यों है? – rapt
यह एस्पेक्टजे में महत्वपूर्ण है लेकिन आप वसंत एओपी में इतना सही नहीं हैं - क्योंकि 'कॉल' (आमतौर पर लक्ष्य के साथ उपयोग किया जाता है) कॉलर बुनाई करेगा, जबकि 'निष्पादन' (इसके साथ) कक्षा को भी बुनाई देगा। यह महत्वपूर्ण है जैसे कि संकलन समय संकलित करने के साथ आपके पास निष्पादन का उपयोग करके बुनाई के लिए तीसरे पक्ष की कक्षा तक पहुंच नहीं हो सकती है, फिर आप तीसरे पक्ष के पुस्तकालयों को कॉल बुना सकते हैं। –
स्पष्टीकरण के लिए धन्यवाद। – rapt