2012-01-11 11 views
7

मैं दो एनोटेशनवसंत एनोटेशन सलाह क्रम

@One 
@Two 
public Object foo() { ... } 

के साथ एक विधि है मैं दो पहलू है कि इन टिप्पणियों को

@Around("@annotation(One)") 
public Object doOne(final ProceedingJoinPoint joinPoint) throws Throwable { ... } 

और

@Around("@annotation(Two)") 
public Object doTwo(final ProceedingJoinPoint joinPoint) throws Throwable { ... } 

का उपयोग किया है लेकिन, जिसमें आदेश है इन सलाहयों को अनिश्चित निष्पादित किया जाता है?

उत्तर

6

आदेश अपरिभाषित है। यदि आपको आदेश निर्धारित करने की आवश्यकता है, तो @Order एनोटेशन का उपयोग करें।

यह भी देखें: जब तक स्पष्ट (उदाहरण के लिए, @Order का उपयोग करके) ने संकेत दिया

+0

यह पता चला है कि मेरे पहलुओं में से एक @ ट्रान्सएक्शनल है और इसलिए मैं इस पर ऑर्डर नहीं कर सकता। –

+2

@ पॉल: '@ ट्रांज़ेक्शनल 'के लिए ऑर्डर' 'की विशेषता द्वारा सेट किया जा सकता है। – axtavt

+0

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

1

आदेश अपरिभाषित है

3

6.2.4.7। सलाह आदेश देने

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

जब विभिन्न पहलुओं में परिभाषित सलाह के दो टुकड़े दोनों को एक ही जोड़ बिंदु पर चलाने की आवश्यकता होती है, जब तक कि आप अन्यथा निर्दिष्ट नहीं करते हैं निष्पादन अपरिभाषित है। आप द्वारा प्राथमिकता निर्दिष्ट करने के निष्पादन के आदेश को नियंत्रित कर सकते हैं। यह या तो द्वारा सामान्य स्प्रिंग तरीके से किया जाता है पहलू कक्षा में org.springframework.core.Ordered इंटरफेस को लागू करने या आदेश टिप्पणी के साथ यह व्याख्या। दो पहलुओं, Ordered.getValue से कम मूल्य() लौटने (या एनोटेशन मूल्य) पहलू को देखते हुए उच्च पूर्वता है।

एक ही पहलू में दोनों परिभाषित सलाह के दो टुकड़े ही में चलाने के लिए बिंदु में शामिल होने की जरूरत है, आदेश अपरिभाषित है (के बाद से वहाँ कोई रास्ता javac संकलित कक्षाओं के लिए प्रतिबिंब के माध्यम से घोषणा आदेश को पुन: प्राप्त करने के लिए है) । प्रत्येक पहलू कक्षा में joinpoint प्रति एक सलाह विधि में इस तरह की सलाह तरीकों गिर विचार करें, या अलग पहलू वर्गों में सलाह की टुकड़े refactor - जो पहलू स्तर पर आदेश दिया जा सकता।

http://static.springsource.org/spring/docs/2.0.x/reference/aop.html

0
  1. रास्ते में एक joinpoint करने के लिए, सबसे कम आदेश मूल्य साथ सलाह पहले मार डाला जाता है।

  2. जॉइनपॉइंट से बाहर निकलने के तरीके पर, सलाह उच्चतम ऑर्डर मूल्य के साथ पहले निष्पादित हो जाती है।

  3. जब एक ही पहलू में परिभाषित सलाह के दो टुकड़े दोनों को एक ही जोड़ बिंदु पर चलाने की आवश्यकता होती है, तो ऑर्डरिंग अनिर्धारित होती है। इस तरह की सलाह विधियों को प्रत्येक पहलू वर्ग में प्रति जुड़ने के लिए एक सलाह विधि में गिरने पर विचार करें, या टुकड़ों को दोबारा दोहराएं अलग पहलू वर्गों में सलाह की - जिसे पहलू स्तर पर आदेश दिया जा सकता है।
+2

मैंने आपको पहले अपनी वेबसाइट के लिंक शामिल करने के बारे में चेतावनी दी है, यह खुलासा किए बिना कि यह आपकी वेबसाइट है। इसके अलावा, आपका लिंक पहले 18 नवंबर को उपयोगकर्ता "मावेरिक" के रूप में पोस्ट करते समय हटा दिया गया था। आपका उत्तर कम से कम कुछ हद तक उपयोगी लगता है, इसलिए दूसरी बार, मैं आपके उत्तर से लिंक हटा दूंगा ताकि यह गलत न हो स्पैम के रूप में हालांकि, मैं ऐसा करने के लिए नहीं जा रहा हूँ। किसी बिंदु पर, यदि आप अपनी वेबसाइट से इस तरह से जुड़ते रहते हैं, तो आपकी पोस्ट को स्पैम के रूप में फ़्लैग किया जा रहा है और हटा दिया गया है। –

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