स्प्रिंग AOP बनाम पहलू


178

मैं इस धारणा के तहत हूं कि स्प्रिंग AOP का उपयोग एप्लिकेशन विशिष्ट कार्यों जैसे सुरक्षा, लॉगिंग, लेन-देन, आदि के लिए किया जाता है क्योंकि यह एक रूपरेखा के रूप में कस्टम Java5 एनोटेशन का उपयोग करता है। हालांकि, AspectJ अधिक अनुकूल डिजाइन-पैटर्न बुद्धिमान लगता है।

क्या कोई स्प्रिंग एओपी बनाम एसपीटीजे का उपयोग करने के विभिन्न पेशेवरों और विपक्षों को एक स्प्रिंग एप्लिकेशन में उजागर कर सकता है?


3
जब स्प्रिंग में कुछ एनोटेशन मौजूद होता है, लेकिन जावा में भी मौजूद होता है, तो आपको क्या करना चाहिए? जावा। इस कार्यक्षमता पर समान तर्क लागू होता है। बसंत बसंत है। आज की बात करो कल को भूल जाओ। (रिमेम्बर लोगों ने स्प्रिंग से कुछ समय पहले स्ट्रट्स का इस्तेमाल किया था)। AspectJ पसंदीदा दीर्घकालिक समाधान है। यह स्प्रिंग को मात देगा। मैं वसंत को खारिज नहीं कर रहा हूँ, बस कह रहा हूँ, इस पहलू के लिए ...: -;
inor

जवाबों:


236

स्प्रिंग-एओपी पेशेवरों

  • यह AspectJ की तुलना में उपयोग करने के लिए सरल है, क्योंकि आपको LTW ( लोड-टाइम बुनाई ) या एस्पेक्टर्स कंपाइलर का उपयोग करने की आवश्यकता नहीं है ।

  • यह प्रॉक्सी पैटर्न और डेकोरेटर पैटर्न का उपयोग करता है

स्प्रिंग-एओपी विपक्ष

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

AspectJ पेशेवरों

  • यह सभी जॉइंटप्वाइंट को सपोर्ट करता है। इसका मतलब है आप कुछ भी कर सकते हैं।
  • स्प्रिंग एओपी की तुलना में कम रनवे ओवरहेड है।

AspectJ विपक्ष

  • सावधान रहे। जांचें कि क्या आपके पहलू केवल वही हैं जो आप बुनना चाहते थे।
  • आपको AspectJ Compiler के साथ अतिरिक्त निर्माण प्रक्रिया की आवश्यकता है या LTW (लोड-टाइम वीविंग) सेटअप करना होगा

20
@Configurable को स्प्रिंग के माध्यम से AspecJ के उपयोग की आवश्यकता है। डॉक्स से:If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ.
एचडीवी

7
मेरे लिए एक और बसंत-अप कोन छद्म-आधारित दृष्टिकोण के कारण अपठनीय लंबे समय के
ढेर हैं

1
उत्तर में भ्रामक भाग: एक उपकरण के लिए एक प्रो पर थोड़ा रनटाइम ओवरहेड कैसे होता है और दूसरे के लिए थोड़ा रन ओवरहेड होने की संभावना है?
मोरकी जू

16
@ मोरेकी: उन्होंने कहा कि 'थोड़ा उपरि' कोन के रूप में, और 'थोड़ा उपरिव्यय' एक समर्थक के रूप में। एकल 'ए' अंतर बहुत महत्वपूर्ण है - अंग्रेजी में, 'थोड़ा' का अर्थ 'कुछ' है, जबकि 'थोड़ा' का अर्थ है 'लगभग कोई नहीं'।
वुजेक २५'१५

1
बस एक त्वरित शंका- आपके स्प्रिंग एओपी प्रोस (द्वितीय बिंदु) में - यदि हम वसंत में @ एनेट कीट के उपयोग का उपयोग करते हैं, तो यह पहलू जेओपी होगा, बस सोच रहा था, इस मामले में कि क्या यह प्रॉक्सी (रन समय) या बाईपास संशोधन (संकलन) का उपयोग करेगा समय)। क्योंकि, मुझे आभास हो रहा है कि एस्पेक्टेज का संकलन समय है और स्प्रिंग एओपी का समय एओपी है। Pls मदद
बाल

21

इसके अलावा दूसरों ने क्या कहा है - सिर्फ प्रतिफल के लिए there are two major differences:

  1. एक बुनाई के प्रकार से संबंधित है।
  2. Joinpoint परिभाषा के लिए एक और।

स्प्रिंग-एओपी: की अवधारणा का उपयोग करके प्रॉक्सी के माध्यम से बुनाई बुनाईdynamic proxy if interface exists or cglib library if direct implementation provided.

पहलू:AspectJ Java Tools(ajc compiler) यदि उपलब्ध स्रोत या संकलन संकलन बुनाई (संकलित फ़ाइलों का उपयोग करके) के माध्यम से संकलन समय । इसके अलावा, स्प्रिंग के साथ लोड होने वाले समय को सक्षम किया जा सकता है - इसे aspectjपरिभाषा फ़ाइल की आवश्यकता है और लचीलापन प्रदान करता है।

संकलित समय बुनाई प्रदर्शन के लाभों की पेशकश कर सकती है (कुछ मामलों में) और भी joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.


20

एक अतिरिक्त नोट: यदि उच्च भार के तहत प्रदर्शन महत्वपूर्ण है, तो आप एस्पेक्टज चाहते हैं जो स्प्रिंग एओपी की तुलना में 9-35x तेज है । 10ns बनाम 355ns ज्यादा नहीं लग सकता है, लेकिन मैंने लोगों को बहुत सारे पहलुओं का उपयोग करते हुए देखा है। पहलुओं के 10K के मूल्य। इन मामलों में, आपका अनुरोध हजारों पहलुओं को प्रभावित कर सकता है। उस स्थिति में आप उस अनुरोध में एमएस जोड़ रहे हैं।

बेंचमार्क देखें ।



18

वसंत उपयोगकर्ता मैनुअल बहुत सारी जानकारी देगा, सीधे घोड़े के मुंह से।

अध्याय 6.4 - यह चुनने के लिए कि किस AOP घोषणा शैली का उपयोग आपके लिए मृत है, क्योंकि यह दोनों के पेशेवरों और विपक्षों पर चर्चा करता है।

पैराग्राफ 6.1.2 - स्प्रिंग एओपी कैपेबिलिटीज और गोल और अध्याय 6.2 - @ समर्थन समर्थन और 6.8 - स्प्रिंग अनुप्रयोगों के साथ एस्पेक्टेज का उपयोग विशेष रूप से दिलचस्प होना चाहिए।


14

स्प्रिंग एओपी वसंत ढांचे के आवश्यक भागों में से एक है। बहुत ही मूल अवस्था में, स्प्रिंग फ्रेमवर्क IoC और AOP पर आधारित है। वसंत के आधिकारिक पाठ्यक्रम में एक स्लाइड है जिसमें यह कहता है:

AOP फ्रेमवर्क के सबसे महत्वपूर्ण भागों में से एक है।

वसंत में एओपी कैसे काम करता है, यह समझने के लिए महत्वपूर्ण बिंदु यह है कि जब आप स्प्रिंग के साथ एक पहलू लिखते हैं तो हम आपकी वस्तुओं के लिए एक प्रॉक्सी बनाने के साथ फ्रेमवर्क को लिख देते हैं, JDKDynamicProxyअगर आपका बीन एक इंटरफ़ेस लागू करता है या सीजीएलआईबी के माध्यम से अगर आपका बीन किसी भी लागू नहीं करता है। इंटरफेस। याद रखें कि यदि आप 3.2 संस्करण से पहले स्प्रिंग का उपयोग कर रहे हैं तो आपको अपने वर्ग-पथ में 2.2 cglib होना चाहिए। स्प्रिंग 3.2 से शुरू करना बेकार है क्योंकि cglib 2.2 को कोर में शामिल किया गया था।

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

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

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

दूसरी ओर, स्प्रिंग एओपी के साथ आप एओपी की सभी शक्ति का उपयोग नहीं कर सकते क्योंकि कार्यान्वयन प्रॉक्सी के माध्यम से किया जाता है और आपके कोड के संशोधन के माध्यम से नहीं।

एस्पेक्टज की तरह, आप स्प्रिंगएओपी में लोड-टाइम बुनाई का उपयोग कर सकते हैं। आप वसंत में इस सुविधा से लाभ उठा सकते हैं एक एजेंट और विशेष कॉन्फ़िगरेशन के साथ, @EnabledLoadWeavingया एक्सएमएल में लागू किया जाता है । आप उदाहरण के रूप में नाम-स्थान का उपयोग कर सकते हैं। हालाँकि स्प्रिंग AOP में आप सभी मामलों को रोक नहीं सकते। उदाहरण के लिए, newकमांड स्प्रिंग एओपी में समर्थित नहीं है।

हालांकि स्प्रिंग एओपी में आप aspectofस्प्रिंग कॉन्फ़िगरेशन बीन में फैक्टरी विधि के उपयोग के माध्यम से एस्पेक्टेज के उपयोग से लाभ उठा सकते हैं ।

इस कारण से कि स्प्रिंग एओपी मूल रूप से कंटेनर से निर्मित एक प्रॉक्सी है, इसलिए आप एओपी का उपयोग केवल स्प्रिंग बीन्स के लिए कर सकते हैं। जबकि पहलू के साथ आप अपने सभी बीन्स में पहलू का उपयोग कर सकते हैं। तुलना का एक और बिंदु डिबग और कोड व्यवहार की भविष्यवाणी है। स्प्रिंग एओपी के साथ, जावा कंपाइलर से सभी कार्य पूर्वनिर्मित हैं और आपके स्प्रिंग बीन के लिए प्रॉक्सी बनाने के लिए पहलू बहुत ही शानदार तरीका है। AspectJ में यदि आप कोड को संशोधित करते हैं, तो आपको अधिक संकलन की आवश्यकता होती है और यह समझने के लिए कि आपके पहलू कहाँ हैं, कठिन हो सकता है। यहां तक ​​कि वसंत में बुनाई बंद करना सरल है: वसंत के साथ आप अपने कॉन्फ़िगरेशन से पहलू को हटा देते हैं, पुनरारंभ करते हैं और यह काम करता है। AspectJ में आपको कोड recompile करना होगा!

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

मुझे उम्मीद है कि एस्पेक्टज और स्प्रिंग एओपी का यह मनोरम वर्णन आपको दो औषधि के अंतर को समझने में मदद करता है


0

यह विचार करना महत्वपूर्ण है कि क्या आपके पहलू मिशन के लिए महत्वपूर्ण होंगे और आपके कोड को कहां तैनात किया जा रहा है। स्प्रिंग एओपी का मतलब होगा कि आप लोड-टाइम बुनाई पर भरोसा कर रहे हैं। यह बुनाई करने में विफल हो सकता है और मेरे अनुभव में इसका मतलब है कि लॉग त्रुटियां मौजूद हो सकती हैं, लेकिन एप्लिकेशन को पहलू कोड के बिना चलने से नहीं रोक पाएगी [मैं कैविएट जोड़ूंगा कि इसे इस तरह से कॉन्फ़िगर करना संभव हो सकता है कि यह नहीं है मामला; लेकिन मैं व्यक्तिगत रूप से इससे अवगत नहीं हूं ]। संकलन-समय की बुनाई इससे बचती है।

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

एक और विचार यह है कि क्या आप एप्लिकेशन को ऐसे वातावरण में होस्ट कर रहे हैं जहां आप सर्वर / एप्लिकेशन स्टार्टअप की सफलता या विफलता की सीधे निगरानी कर पा रहे हैं या क्या आपका एप्लिकेशन ऐसे वातावरण में तैनात किया जा रहा है जहां वह आपकी देखरेख में नहीं है क्लाइंट द्वारा होस्ट किया जाता है]। फिर, यह समय बुनाई को संकलित करने का तरीका होगा।

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


0

इस लेख में विषय के बारे में अच्छी व्याख्या भी है।

स्प्रिंग AOP और AspectJ के अलग-अलग लक्ष्य हैं।

स्प्रिंग एओपी का उद्देश्य प्रोग्रामर का सामना करने वाली सबसे आम समस्याओं को हल करने के लिए स्प्रिंग आईओसी पर एक साधारण एओपी कार्यान्वयन प्रदान करना है।

दूसरी ओर, AspectJ मूल AOP तकनीक है जिसका उद्देश्य पूर्ण AOP समाधान प्रदान करना है।


0

AOP की तुलना में, AspectJ को संकलन समय पर लक्ष्य वर्ग को बढ़ाने की आवश्यकता नहीं है। इसके बजाय, यह रनटाइम पर लक्ष्य वर्ग के लिए एक प्रॉक्सी क्लास बनाता है, जो या तो लक्ष्य वर्ग के समान इंटरफ़ेस को लागू करता है या लक्ष्य वर्ग का एक उपवर्ग होता है।

सारांश में, एक प्रॉक्सी क्लास का एक उदाहरण एक लक्ष्य वर्ग के एक उदाहरण के रूप में इस्तेमाल किया जा सकता है। सामान्य तौर पर, कंपाइल-टाइम एन्हांस्ड AOP फ्रेमवर्क प्रदर्शन में अधिक लाभप्रद होता है- क्योंकि रनटाइम-एनओपी-एओपी फ्रेमवर्क को हर बार चलने पर गतिशील संवर्द्धन की आवश्यकता होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.