spring - वसंत एओपी: जॉइनपॉइंट और पॉइंटकूट के बीच क्या अंतर है?




aop aspectj (9)

परिभाषाएं

दस्तावेज़ीकरण के अनुसार:

बिंदु में शामिल हों: किसी प्रोग्राम के निष्पादन के दौरान एक बिंदु, जैसे किसी विधि का निष्पादन या अपवाद का संचालन।

आप एक कार्यक्रम के निष्पादन में घटनाओं के रूप में संयुक्त अंक पर विचार कर सकते हैं। यदि आप स्प्रिंग एओपी का उपयोग कर रहे हैं, तो यह विधियों के आविष्कार तक ही सीमित है। AspectJ अधिक लचीलापन प्रदान करता है।

लेकिन जब आप किसी रेस्तरां में जाते हैं तो आप मेनू में सभी भोजन नहीं खाते हैं (आप मुझे नहीं जानते, आप शायद! लेकिन, मैं निश्चित रूप से नहीं करता)। तो आप संभालने के लिए घटनाओं का चयन करते हैं और उनके साथ क्या करना है। यहां पॉइंटकूट चला जाता है। दस्तावेज के अनुसार,

प्वाइंटकट : एक अनुमान है कि अंक में शामिल होने से मेल खाता है।

फिर आप प्वाइंटकट के साथ क्या करना चाहते हैं, सलाह ले जाती है। दस्तावेज के अनुसार,

सलाह पॉइंटकट अभिव्यक्ति से जुड़ी है और पॉइंटकट द्वारा मेल खाने वाले किसी भी बिंदु पर चलता है।

कोड

package com.amanu.example;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * @author Amanuel Nega on 10/25/16.
 */
class ExampleBussinessClass {

    public Object doYourBusiness() {
        return new Object();
    }

}

@Aspect
class SomeAspect {

    @Pointcut("execution(* com.amanu.example.ExampleBussinessClass.doYourBusiness())")
    public void somePointCut() {
    }//Empty body suffices

    @After("somePointCut()")
    public void afterSomePointCut() {
        //Do what you want to do before the joint point is executed
    }

    @Before("execution(* *(*))")
    public void beforeSomePointCut() {
        //Do what you want to do before the joint point is executed
    }

}

संहिता की व्याख्या

  • ExampleBusinessClass प्रॉक्सी-एड, हमारा लक्ष्य है!
  • doYourBusiness() एक संभावित संयुक्त बिंदु है
  • SomeAspect हमारा पहलू है जो कई चिंताओं को पार करता है जैसे कि गधे SomeAspect
  • somePointCut() एक बिंदु कट की परिभाषा है जो हमारे संयुक्त बिंदु से मेल खाती है
  • afterSomePointCut() के बाद एक सलाह है जिसे हमारे कुछ somePointCut पॉइंट कट के बाद निष्पादित किया जाएगा जो आपके व्यवसाय से मेल खाता है doYourBusiness() संयुक्त बिंदु
  • beforeSomePointCut() से पहले भी एक सलाह है जो सभी public विधि निष्पादन से मेल खाती है। afterSomePointCut विपरीत, यह एक इनलाइन पॉइंट कट घोषणा का उपयोग करता है

यदि आप मुझ पर विश्वास नहीं करते हैं तो आप documentation को देख सकते हैं। आशा है कि ये आपकी मदद करेगा

मैं पहलू ओरिएंटेड प्रोग्रामिंग अवधारणाओं और वसंत एओपी सीख रहा हूँ। मैं पॉइंटकट और जॉइनपॉइंट के बीच अंतर को समझने में असफल रहा हूं - उनमें से दोनों मेरे लिए समान हैं। एक पॉइंटकट वह जगह है जहां आप अपनी सलाह लागू करते हैं और जॉइनपॉइंट भी एक ऐसा स्थान है जहां हम अपनी सलाह लागू कर सकते हैं, तो क्या अंतर है?

पॉइंटकट का एक उदाहरण हो सकता है:

@Pointcut("execution(* * getName()")

जॉइनपॉइंट का उदाहरण क्या हो सकता है?


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


एक पॉइंटकट पहलू वर्ग कार्यान्वयन पर परिभाषित किया गया है। प्वाइंट कट मूल रूप से सलाह के भीतर पॉइंटकट अभिव्यक्ति को संदर्भित करता है।

उदाहरण के लिए,

@Before("execution(* app.purchase2.service.impl.*(..))")
public void includeAddOns(RolesAllowed roles) {
..
}

उपर्युक्त साधन, "includeAddOns" विधि को आमंत्रित करने से पहले कहा जाता है (किसी भी तरीके से सलाह के कारण) (पैकेज के भीतर कक्षाओं में "app.purchase2.service.impl")

पूरे एनोटेशन को @Before("execution(* app.purchase2.service.impl.*(..))") कहा जाता है @Before("execution(* app.purchase2.service.impl.*(..))")

संयुक्त बिंदु वास्तविक विधि आमंत्रण है, जो पहलू वर्ग "appAddOns ()" में विधि में "app.purchase2.service.impl" पैकेज में विधि में शामिल हो गया है।

आप org.aspectj.lang.JoinPoint क्लास के साथ शामिल बिंदु के गुणों तक पहुंच सकते हैं।


किसी व्यक्ति के लिए लेमन स्पष्टीकरण जो अवधारणाओं के लिए नया है एओपी। यह संपूर्ण नहीं है, लेकिन अवधारणाओं को समझने में मदद करनी चाहिए। यदि आप मूल शब्दावली से पहले ही परिचित हैं, तो आप अभी पढ़ना बंद कर सकते हैं।

मान लीजिए कि आपके पास एक सामान्य वर्ग कर्मचारी है और आप इन तरीकों को हर बार कुछ करना चाहते हैं।

class Employee{
    public String getName(int id){....}
    private int getID(String name){...}
}

इन तरीकों को JoinPoints कहा जाता है। हमें इन तरीकों की पहचान करने के लिए एक तरीका चाहिए ताकि ढांचे सभी वर्गों के बीच विधियों को पा सकें। विधि जो इसे लोड कर चुके हैं। इसलिए हम इन विधियों के हस्ताक्षर से मेल खाने के लिए एक नियमित अभिव्यक्ति लिखेंगे। जबकि इसके लिए और भी कुछ है जैसा कि आप नीचे देखेंगे, लेकिन कम से कम यह नियमित अभिव्यक्ति पॉइंटकट को परिभाषित करती है। जैसे

* * mypackage.Employee.get*(*)

पहला * संशोधक सार्वजनिक / निजी / संरक्षित / डिफ़ॉल्ट के लिए है। दूसरा * विधि के वापसी प्रकार के लिए है।

लेकिन फिर आपको दो और बातें बताने की भी आवश्यकता है:

  1. एक कार्रवाई कब की जानी चाहिए - उदाहरण के लिए विधि निष्पादन से पहले या अपवाद पर
  2. जब यह मेल खाता है तो इसे क्या करना चाहिए (शायद एक संदेश प्रिंट करें)

इन दोनों के संयोजन को सलाह कहा जाता है।

जैसा कि आप कल्पना कर सकते हैं, आपको # 2 करने में सक्षम होने के लिए एक फ़ंक्शन लिखना होगा। तो यह मूल बातें के लिए ऐसा लग सकता है।

नोट: स्पष्टता के लिए, * * mypackage.Employee.get*(*) बजाय शब्द REGEX का उपयोग करना। हकीकत में पूर्ण अभिव्यक्ति परिभाषा में जाती है।

@Before("execution(REGEX)")
public void doBeforeLogging() {....}   <-- executed before the matching-method is called

@After("execution(REGEX)")
public void doAfterLogging() {....}  <-- executed after the matching-method is called

एक बार जब आप इन्हें थोड़ा सा उपयोग करना शुरू कर देते हैं, तो आप सलाह के आसपास कई @ @ / @ पहले / @ निर्दिष्ट कर सकते हैं। बार-बार नियमित अभिव्यक्तियां अंततः चीजों को भ्रमित करने और बनाए रखने में मुश्किल बनाती हैं। तो हम क्या करते हैं, हम सिर्फ अभिव्यक्ति का नाम देते हैं और पहलू वर्ग में हर जगह इसका इस्तेमाल करते हैं।

@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty

@Before("allGetterLogging")
public void doBeforeLogging() {....}

@After("allGetterLogging")
public void doAfterLogging() {....}

बीटीडब्ल्यू, आप इस पूरे तर्क को कक्षा में भी लपेटना चाहते हैं, जिसे पहलू कहा जाता है और आप एक वर्ग लिखेंगे:

@Aspect
public class MyAwesomeAspect{....}

इन सभी चीजों को काम करने के लिए, आपको स्प्रिंग्स को कक्षाओं को पढ़ने, समझने और @ एओपी कीवर्ड पर कार्रवाई करने के लिए पर्स करना होगा। ऐसा करने का एक तरीका वसंत कॉन्फ़िगर xml फ़ाइल में निम्न निर्दिष्ट कर रहा है:

<aop:aspectj-autoproxy>


प्वाइंट प्वाइंट एक ऐसा स्थान है जहां हम वास्तव में सलाह देते हैं

लेकिन प्वाइंट कट इन पॉइंट्स का संग्रह है। इसका मतलब है कि हम क्रॉस-काटने तर्क को कितने तरीके से स्थापित करते हैं उसे पॉइंट कट कहा जाता है


मैं mgroves के साथ सहमत हूँ .. एक बिंदु कट कई संयुक्त बिंदुओं के संग्रह के रूप में माना जा सकता है। संयुक्त बिंदु उस विशेष स्थान को निर्दिष्ट करता है जहां सलाह लागू की जा सकती है, जहां पॉइंटकट सभी संयुक्त बिंदुओं की सूची को दर्शाता है।


JoinPoint: यह एप्लिकेशन में एक बिंदु (विधि) निर्दिष्ट करता है जहां सलाह निष्पादित की जाएगी।

प्वाइंटकट: यह जॉइनपॉइंट्स का संयोजन है, और यह निर्दिष्ट करता है कि जिस पर जॉइनपॉइंट सलाह निष्पादित की जाएगी।


JoinPoint : जॉइनपॉइंट आपके प्रोग्राम निष्पादन में बिंदु हैं जहां निष्पादन का प्रवाह अपवाद पकड़ने, अन्य विधि को कॉल करने जैसे बदल गया है।

प्वाइंटकूट : पॉइंटकूट मूल रूप से उन जॉइनपॉइंट्स हैं जहां आप अपनी सलाह (या पहलू कॉल कर सकते हैं) डाल सकते हैं।

तो मूल रूप से प्वाइंटकूट्स JoinPoints का सबसेट है


जॉइनपॉइंट: एक जॉइनपॉइंट एप्लिकेशन के प्रोग्राम निष्पादन में एक उम्मीदवार बिंदु है जहां एक पहलू को प्लग किया जा सकता है। यह बिंदु एक विधि कहा जा सकता है, एक अपवाद फेंक दिया जा सकता है, या यहां तक ​​कि एक फ़ील्ड भी संशोधित किया जा सकता है। ये वे बिंदु हैं जहां नए व्यवहार को जोड़ने के लिए आपके पहलू के कोड को आपके आवेदन के सामान्य प्रवाह में डाला जा सकता है।

सलाह: यह एक ऐसा ऑब्जेक्ट है जिसमें एक बिंदु द्वारा निर्दिष्ट एक जॉइंटपॉइंट पर प्रदर्शन करने के लिए कार्रवाई की प्रतिनिधित्व करने वाली प्रणाली व्यापक चिंताओं को एपीआई आमंत्रण शामिल है।

प्वाइंटकट: एक पॉइंटकट जो जोड़ों पर निर्भर करता है, संबंधित सलाह लागू की जानी चाहिए। एओपी ढांचे द्वारा समर्थित किसी भी जॉइनपॉइंट पर सलाह लागू की जा सकती है। बेशक, आप अपने सभी पहलुओं को सभी संभावित जोड़ों पर लागू नहीं करना चाहते हैं। पॉइंटकट आपको यह निर्दिष्ट करने की अनुमति देता है कि आप कहां अपनी सलाह लागू करना चाहते हैं। अक्सर आप इन क्लाइंट्स को स्पष्ट वर्ग और विधि नामों का उपयोग करके या नियमित अभिव्यक्तियों के माध्यम से निर्दिष्ट करते हैं जो मेलिंग क्लास और विधि नाम पैटर्न को परिभाषित करते हैं। कुछ एओपी ढांचे आपको गतिशील पॉइंटकट बनाने की अनुमति देते हैं जो यह निर्धारित करते हैं कि रनटाइम निर्णयों के आधार पर सलाह लागू करना है, जैसे विधि पैरामीटर के मूल्य।

निम्नलिखित छवि आपको सलाह, प्वाइंटकूट, जॉइनपॉइंट्स को समझने में मदद कर सकती है।

Source

रेस्तरां एनालॉजी का उपयोग करके स्पष्टीकरण: @ विक्टर द्वारा स्रोत

जब आप किसी रेस्तरां में जाते हैं, तो आप मेनू देखते हैं और चुनने के लिए कई विकल्प देखते हैं। आप मेनू में से किसी एक आइटम को ऑर्डर कर सकते हैं। लेकिन जब तक आप वास्तव में उन्हें आदेश नहीं देते हैं, वे केवल "खाने के अवसर" हैं। एक बार जब आप ऑर्डर देते हैं और वेटर इसे आपकी टेबल पर लाता है, तो यह भोजन होता है।

मेनू पर जॉइनपॉइंट विकल्प हैं और पॉइंटकट्स आपके द्वारा चुने गए आइटम हैं।

एक जॉइनपॉइंट आपके लिए एक पहलू लागू करने के लिए कोड के भीतर एक अवसर है ... बस एक अवसर। एक बार जब आप उस अवसर को ले लें और एक या अधिक जॉइनपॉइंट्स का चयन करें और उनके लिए एक पहलू लागू करें, तो आपको पॉइंटकट मिल गया है।







pointcut