2012-06-10 15 views
6

के पीछे बड़ा विचार क्या है, मैं इसे अपने लिए स्पष्ट करना चाहता था।एओपी कार्यान्वयन

मैंने एओपी अवधारणा के बारे में पढ़ा और मुझे समझ में आया कि यह क्रॉस काटने की सेवाओं को साझा करने का एक शानदार तरीका है। (प्रवेश, सुरक्षा, लेन-देन ...)

लेकिन मैं कहता हूँ/इस विचार के बारे में कुछ पूछना चाहते हैं और यह कार्यान्वयन है।

मैंने पढ़ा है वहाँ आदेश मेरे व्यापार तर्क को AOP आत्मसात करने के लिए AspectJ, JBoss AOP जैसे कुछ तरीके हैं।

लेकिन यह पहले से ही बहुत समय पहले नहीं था?

मैं एक सिंगलटन सेम यकीन है कि यह केवल एक है बनाने क्यों नहीं लगा सकता है के उदाहरण के लिए मान लीजिए मैं साझा करने के लिए एक प्रवेश या सुरक्षा कार्यान्वयन मेरी घटकों amongs चाहते हैं (जावा सेम, EJB है, जो भी ..) उदाहरण और जैसे ही किसी भी घटक को इसकी लॉगिंग/सुरक्षा सेवा की आवश्यकता होगी, यह देखेगा और इसकी सेवा का उपयोग करेगा।

क्यों मैं समझता हूँ और इस तरह के AspectJ या jboss AOP पास उन सभी को "बिग" कार्यान्वयन के लिए की आवश्यकता होगी? मुझे यहाँ क्या याद आती है?

उत्तर

9

एओपी का विचार सामान्य तर्क को एक स्थान पर रखना है (जो आपका सिंगलटन समाधान भी हल करता है) और "अदृश्य" (पारदर्शी) होना। एओपी के साथ आपका लॉगिंग कोड व्यापार तर्क का हिस्सा भी नहीं है, यह दृश्यों के पीछे "इंजेक्शन" है।

यह भी अधिक गतिशील है - आपको लॉग इन करने की आवश्यकता होने पर आपको अपनी सिंगलटन सेवा को कॉल करने की आवश्यकता नहीं है। बस एक बार पॉइंटकट कॉन्फ़िगर करें (जैसे: "इस पैकेज में सभी सेटर्स") और लॉगिंग सभी मौजूदा और नए कोड के लिए लागू की जाएगी।

इसके अलावा एओपी बहुत अधिक लचीला और शक्तिशाली है। आप AOP कार्यान्वयन पूछ सकते हैं: "एक सौदे हर बार शुरू करें मैं एक विधि के साथ शुरुआत कॉल" save* "और एक तर्क ले जा" या "अगर विधि लौटने CustomerIllegalAgumentException से एक अपवाद उपवर्गीकरण फेंकता है, उस विधि फिर से फोन"।

एओपी सामान्य तर्क को समूहीकृत करने से कहीं अधिक है।

+0

यदि मैं अभिभावक वर्ग बनाता हूं और विस्तार करता हूं तो मेरी कक्षाएं इसका विस्तार करती हैं। मैं उस पेरेंट क्लास में अपना "पर्समेंट" तर्क डाल सकता था। जब कोई वर्ग इसे विस्तारित करेगा, तो यह सभी लॉगगिग/सेक्यूटरी ... का आनंद लेने में सक्षम होगा जो मैंने पहले घोषित किया होगा। मैं पेमेंट लॉगगिग के लिए "बनाना"/"नष्ट" भी कर सकता हूं और इस तरह .. – rayman

+0

@rayman: लेकिन आपको अभी भी ** इन विधियों को स्पष्ट रूप से कॉल करने की आवश्यकता है (महान कोड नमूना * जेबी निजेट * देखें)। आपके द्वारा एक बार निर्देशित किए गए कोड के लिए एओपी आपके लिए यह भी करेगा! इसका यह भी अर्थ है कि नए प्रोग्रामर लॉगिंग/सुरक्षा सुविधाओं का आनंद लेंगे, उनके बारे में भी जानते हुए।उल्लेख नहीं है कि आप बेस क्लास/हेल्पर विधियों के साथ अपने कोड को अव्यवस्थित नहीं कर रहे हैं –

+0

माबे आप जेबी को अपनी आखिरी टिप्पणी देख सकते हैं। – rayman

6

आपको समझ में नहीं आया कि एओपी क्या है। AOP के विचार

public void foo() { 
    // some business code 
} 

लिखने के बजाय

public void foo() { 
    LogManager.getInstance().log("entering foo..."); 
    SecurityManager.getInstance().checkUserInRole("fooer"); 
    TransactionManager.getInstance().startTransaction(); 
    try { 
     // some business code 
     TransactionManager.getInstance().commit(); 
    } 
    catch(RuntimeException e) { 
     TransactionManager.getInstance().rollback(); 
     throw e; 
    } 
    LogManager.getInstance().log("leaving foo..."); 
} 

सभी पार काटने चिंताओं (लॉगिंग, सुरक्षा, लेन-देन प्रबंधन) व्यापार कोड के बाहर हैं लिखने के लिए सक्षम, बजाय हो रहा है व्यापार कोड के साथ मिश्रित किया जा रहा है, और दोहराया विज्ञापन मतली।

+0

लेकिन आपको अभी भी एओपी तर्क को बताने की जरूरत है जब आप उन सेवाओं का उपयोग करना चाहते हैं .. यह कैसे पता चलेगा कि मैं एक विधि के प्रवेश/बाहर निकलना चाहता हूं? या अगर मैं सिर्फ लॉग इन करना चाहता हूं। मेरी विधि के बीच में कुछ डिबग करें .. कुछ को इसे करने के लिए इसे बताने की ज़रूरत है। यह मेरे दिमाग को पढ़ नहीं सकता .. – rayman

+0

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

+0

तो चलो मैं इसका उपयोग केवल लॉगिंग/सुरक्षा के लिए करूँगा .. क्या यह सिर्फ इसके लिए थोड़ा अधिक नहीं है? क्या आपके पास पहले उल्लेखित 3 के बगल में एओपी का उपयोग करने के लिए और अधिक समाधान हैं? – rayman

संबंधित मुद्दे