2010-03-05 12 views
40

मेरे पास यह स्प्रिंग कॉन्फ़िगरेशन है:वसंत Autowiring कक्षा बनाम इंटरफ़ेस?

<bean id="boo" class="com.x.TheClass"/> 

कक्षा TheClassTheInterface लागू करता है। तब मेरे पास यह (काल्पनिक) जावा कोड है:

@Autowired 
TheInterface x; 

@Autowired 
TheClass y; 

TheInterface काम करता है लेकिन TheClass की ऑटोवॉयरिंग विफल हो जाती है। वसंत मुझे कक्षा के लिए एक NoSuchBeanDefinitionException देता है।

आप इंटरफ़ेस को क्यों तार कर सकते हैं, कक्षा नहीं?

+6

क्या इस वर्ग के बारे में कुछ खास है, जैसे कि यह 'अंतिम' है, या अन्य उपकरण, जैसे @ ट्रांसेक्शनल, पर। आप या तो CGLIB की तरह एक वाद्ययंत्र lib, या अंतिम श्रेणी पर एक उपclass प्रॉक्सी बनाने की कोशिश कर रहे हैं। – ptomli

उत्तर

54

आम तौर पर, दोनों काम करेंगे, आप इंटरफेस या कक्षाओं को स्वचालित कर सकते हैं।

शायद आपके संदर्भ में कहीं भी एक ऑटोप्रोक्सी जनरेटर है, जो आपके boo बीन को जेनरेट प्रॉक्सी ऑब्जेक्ट में लपेट रहा है। यह प्रॉक्सी ऑब्जेक्ट TheInterface लागू करेगा, लेकिन TheClass नहीं होगा। ऑटोप्रोक्सिस का उपयोग करते समय, आपको इंटरफ़ेस में प्रोग्राम करने की आवश्यकता होती है, कार्यान्वयन नहीं।

संभावित उम्मीदवार लेनदेन संबंधी प्रॉक्सी है - क्या आप AspectJ या @Transactional का उपयोग करके वसंत लेनदेन का उपयोग कर रहे हैं?

+0

हां, इसमें '@ ट्रांजेक्शनल 'है, इस परिदृश्य की तरह लगता है अमान्य है .. –

+5

@Marcus: यही समस्या है। यदि आप '@ ट्रांजेक्शनल 'और' 'का उपयोग करते हैं, तो आप बीन को' MyClass' पर नहीं डाल सकते हैं, आपको इंटरफ़ेस का उपयोग करना होगा। – skaffman

+27

मुझे पता है कि यह थोड़ा पुराना है, लेकिन यहां थोड़ा सा जोड़ने के लिए ... आप इंटरफ़ेस का उपयोग करने के लिए _have_ नहीं करते हैं, लेकिन कक्षा को सीधे ऑटोवायर करने के लिए, आपको ' 'कॉन्फ़िगरेशन और 'प्रॉक्सी-लक्ष्य-वर्ग =" सत्य "जोड़ें (यह गलत पर डिफ़ॉल्ट है)। यह आपको कक्षा में सीधे ऑटो-वायर करने देता है। ध्यान दें कि अजीब दुष्प्रभाव हो सकते हैं, उदा। मैंने जेनेरिक बेस क्लास के लिए पैरामीटरयुक्त प्रकार को खोजने के लिए कुछ प्रतिबिंब का उपयोग किया था। प्रॉक्सी कक्षा के कारण विरासत बदल दी गई है, इसलिए मुझे इसे ध्यान में रखना पड़ा। आप अभी भी 'proxy-target-class = "true" के साथ इंटरफ़ेस द्वारा तार कर सकते हैं। –

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