किसी के लिए आम आदमी की व्याख्या जो अवधारणाओं के लिए नया है AOP। यह संपूर्ण नहीं है, लेकिन अवधारणाओं को समझने में मदद करनी चाहिए। यदि आप पहले से ही मूल शब्दजाल से परिचित हैं, तो आप अभी पढ़ना बंद कर सकते हैं।
मान लें कि आपके पास एक सामान्य वर्ग का कर्मचारी है और आप हर बार कुछ करना चाहते हैं, तो ये तरीके कहलाते हैं।
class Employee{
public String getName(int id){....}
private int getID(String name){...}
}
इन विधियों को JoinPoints कहा जाता है । हमें इन विधियों को पहचानने के लिए एक तरीका चाहिए ताकि रूपरेखा उन सभी वर्गों के बीच पा सके। इसलिए हम इन विधियों के हस्ताक्षर से मेल खाने के लिए एक नियमित अभिव्यक्ति लिखेंगे। जबकि इसमें और भी बहुत कुछ है जैसा कि आप नीचे देखेंगे, लेकिन शिथिल यह नियमित अभिव्यक्ति है जो पॉइंटकट को परिभाषित करती है । जैसे
* * mypackage.Employee.get*(*)
पहला * संशोधक सार्वजनिक / निजी / संरक्षित / डिफ़ॉल्ट के लिए है। दूसरा * वापसी विधि के प्रकार के लिए है।
लेकिन फिर आपको दो और बातें भी बताने की जरूरत है:
- जब कोई कार्रवाई की जानी चाहिए - जैसे विधि निष्पादन से पहले या अपवाद के बाद
- जब यह मेल खाता है तो क्या करना चाहिए (शायद सिर्फ एक संदेश प्रिंट करें)
इन दोनों के संयोजन को सलाह कहा जाता है ।
जैसा कि आप कल्पना कर सकते हैं, आपको # 2 करने में सक्षम होने के लिए एक फ़ंक्शन लिखना होगा। तो यह है कि यह मूल बातें कैसे दिख सकता है।
नोट: स्पष्टता के लिए, के बजाय REGEX शब्द का उपयोग करें * * mypackage.Employee.get*(*)
। वास्तव में पूर्ण अभिव्यक्ति परिभाषा में जाती है।
@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() {....}
BTW, आप इस पूरे तर्क को एक कक्षा में लपेटना चाहेंगे, जिसे Aspect कहा जाता है और आप एक वर्ग लिखेंगे:
@Aspect
public class MyAwesomeAspect{....}
इन सभी चीजों को काम करने के लिए, आपको @ AOP कीवर्ड पर पढ़ने, समझने और कार्रवाई करने के लिए कक्षाओं को पार्स करने के लिए स्प्रिंग को बताना होगा। ऐसा करने का एक तरीका निम्नलिखित है जो स्प्रिंग कॉन्फिग xml फ़ाइल में निर्दिष्ट है:
<aop:aspectj-autoproxy>