2012-08-12 22 views
10

Spring Documentation से बनाम:स्प्रिंग AOP लक्ष्य() इस()

this(com.xyz.service.AccountService) 
  • :

    • किसी भी बिंदु (विधि निष्पादन केवल स्प्रिंग AOP में) जहां प्रॉक्सी AccountService इंटरफ़ेस लागू करता है में शामिल होने के कोई भी शामिल बिंदु (केवल स्प्रिंग एओपी में विधि निष्पादन) जहां लक्ष्य ऑब्जेक्ट खाता सेवा इंटरफ़ेस लागू करता है:

      target(com.xyz.service.AccountService) 
      

    मुझे समझ में नहीं आता कि "लक्ष्य वस्तु" और अभिव्यक्ति target(...) का अर्थ क्या है।

    targetthis से अलग कैसे है?

  • उत्तर

    17

    this(AType) का मतलब सभी शामिल बिंदुओं पर this instanceof AType सत्य है। तो इसका मतलब है कि आपके मामले में जब कॉल खाता सेवा this instanceof AccountService की किसी भी विधि तक पहुंच जाए तो यह सच होगा।

    target(AType) का मतलब है सभी anObject instanceof AType में शामिल हों। यदि आप किसी ऑब्जेक्ट पर कोई विधि कॉल कर रहे हैं और वह ऑब्जेक्ट खाता सेवा का एक उदाहरण है, तो यह एक वैध जॉइनपॉइंट होगा।

    एक अलग तरीके से संक्षेप में - this(AType) एक रिसीवर परिप्रेक्ष्य से है, और target(AType) कॉलर्स परिप्रेक्ष्य से है।

    +0

    अगर मैं तुम्हें सही मिलता है ... दोनों 'this' और' target' एक ही बात करते हैं ??? एक बार मेरा कोड 'खाता सेवा' की कुछ विधि निष्पादित करने का प्रयास करता है, फिर रिसीवर बिंदु दृश्य से, 'खाता सेवा' का यह उदाहरण सत्य है; और कॉलर पॉइंट व्यू से 'जिसे ऑब्जेक्ट उदाहरण खाताधारक' कहा जाता है, भी सच है। तो यह अनावश्यकता क्यों है? – rapt

    +0

    यह एस्पेक्टजे में महत्वपूर्ण है लेकिन आप वसंत एओपी में इतना सही नहीं हैं - क्योंकि 'कॉल' (आमतौर पर लक्ष्य के साथ उपयोग किया जाता है) कॉलर बुनाई करेगा, जबकि 'निष्पादन' (इसके साथ) कक्षा को भी बुनाई देगा। यह महत्वपूर्ण है जैसे कि संकलन समय संकलित करने के साथ आपके पास निष्पादन का उपयोग करके बुनाई के लिए तीसरे पक्ष की कक्षा तक पहुंच नहीं हो सकती है, फिर आप तीसरे पक्ष के पुस्तकालयों को कॉल बुना सकते हैं। –

    +0

    स्पष्टीकरण के लिए धन्यवाद। – rapt

    9

    मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं इसके बीच एक महत्वपूर्ण अंतर आया और 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 इंटरफ़ेस को लागू करना

    1. a.b.c.D की प्रत्येक विधि से पहले निष्पादित करने के लिए traceable.increment() पर कॉल जोड़ना।

    महत्वपूर्ण हिस्सा "execution(* a.b.c.D.*(..)) && this(traceable)" है। ध्यान दें कि मैंने का उपयोग किया, लक्ष्य

    आप लक्ष्य बजाय का उपयोग करते हैं, आप मूल वर्ग a.b.c.D, नहीं शुरू की इंटरफ़ेस X मिलान करने के लिए कोशिश कर रहे हैं। तो वसंत एओपी को a.b.c.D में कोई भी शामिल बिंदु नहीं मिलेगा।

    सारांश में:

    इस - प्रॉक्सी प्रकार, या शुरू की प्रकार की जांच करता है। लक्ष्य - घोषित प्रकार की जांच करता है।

    +0

    अच्छा बिंदु, धन्यवाद –

    5
    आधिकारिक दस्तावेज से

    :

    स्प्रिंग AOP एक प्रॉक्सी आधारित प्रणाली है और प्रॉक्सी वस्तु ही ('यह' करने के लिए बाध्य) और प्रॉक्सी के पीछे लक्ष्य वस्तु ('लक्ष्य' के लिए बाध्य) बीच अंतर ।

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts-designators