2010-05-04 9 views
9

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

कैसे xml फ़ाइल दिखता है:

<aop:config> 
    <aop:pointcut expression="execution(......)" id="pointcutOne" /> 
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" /> 

    <aop:aspect id="..." ref="springBean"> 
     <aop:around pointcut-ref="pointcutOne" method="commonMethod" /> 
     <aop:around pointcut-ref="pointcutTwo" method="commonMethod" /> 
    </aop:aspect> 
</aop:config> 

समस्या यह है कि केवल पिछले pointcut काम करता है (अगर मैं आदेश pointcutOne काम करता है बदलने क्योंकि यह पिछले एक है)। मैं इसे एक बड़ा पॉइंटकट बनाकर काम करने के लिए मिला हूं, लेकिन मैं उन्हें अलग करना चाहता हूं। किसी भी सुझाव के लिए कि एक बिंदु में केवल एक बिंदु क्यों काम करता है?

+0

मुझे लगता है कि 'aop: aroung' केवल प्रश्न में एक टाइपो है। – Bozho

+0

हां, इसके बारे में खेद है। –

उत्तर

6

<aop:aspect> तत्व के अंदर पॉइंटकट और सलाह रखने का प्रयास करें। कुछ इस तरह:

<aop:config> 
    <aop:aspect id="aspect1" ref="springBean"> 
    <aop:pointcut expression="execution(......)" id="pointcutOne" /> 
    <aop:around pointcut-ref="pointcutOne" method="commonMethod" /> 
    </aop:aspect> 

    <aop:aspect id="aspect2" ref="springBean"> 
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" /> 
    <aop:around pointcut-ref="pointcutTwo" method="commonMethod" /> 
    </aop:aspect> 
</aop:config> 

मैं अपने XML विन्यास सिर्फ एक प्रॉक्सी वस्तु में हुई, जबकि यह दो प्रॉक्सी वस्तुओं किया जाना चाहिए था लगता है।


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

सभी आप अपने विन्यास में की जरूरत है वसंत AOP साथ @AspectJ पहलुओं सक्षम करने के लिए:

@Aspect 
public class Aspect1 { 

    @Pointcut("execution(* *(..))") 
    public void demoPointcut() {} 

    @Around("demoPointcut()") 
    public void demoAdvice(JoinPoint joinPoint) {} 
} 

अपडेट किया गया::

उदाहरण कुछ इस तरह हो सकता है

<aop:aspectj-autoproxy> 
    <aop:include name="aspect1" /> 
    <aop:include name="aspect2" /> 
</aop:aspectj-autoproxy> 

<bean id="aspect1" class="com.demo.Aspect1"/> 
<bean id="aspect2" class="com.demo.Aspect2"/> 

और पहलू जो तीन अन्य पॉइंटकट्स को गठबंधन करने के लिए पॉइंटकट का उपयोग करता है:

@Pointcut("traceMethodsInDemoPackage() && notInTestClass() " + 
    "&& notSetMethodsInTraceDemoPackage()") 
public void filteredTraceMethodsInDemoPackage() {} 
+0

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

+0

यह अजीब है। प्रॉक्सी ऑब्जेक्ट्स को आपके जॉइनपॉइंट द्वारा सलाह दी गई विधि से पहले और बाद में रिकर्सिव कहा जाना चाहिए था। यदि यह एक पॉइंटकट के साथ काम करता है, तो आप एक तीसरा पॉइंटकट बना सकते हैं जो पहले दो को जोड़ता है और आसपास की सलाह में इसका उपयोग करता है। – Espen

+0

एनोटेशन का उपयोग करना बहुत अच्छा काम करता है, इसलिए मुझे लगता है कि कम से कम अधिकांश पहलुओं को xml के बजाय इसका उपयोग करने के लिए अद्यतन करें। बस जागरूक रहना होगा कि हमें बदलाव करने के लिए पुन: संकलित करने की आवश्यकता है। सहायता के लिए धन्यवाद! –

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