टी एल; डॉ
@Autowired एनोटेशन आपको XML फ़ाइल (या किसी अन्य तरीके) से अपने आप वायरिंग करने की आवश्यकता है और आपको केवल यह बताता है कि आपको कहां इंजेक्ट किया जाना चाहिए और आपके लिए क्या करना है।
पूरी व्याख्या
@Autowiredएनोटेशन आप क्या सुई की कहीं और विन्यास को छोड़ने के लिए अनुमति देता है और सिर्फ तुम्हारे लिए यह करता है। अपना पैकेज मानते हुए com.mycompany.moviesआपको यह टैग अपनी XML (एप्लिकेशन संदर्भ फ़ाइल) में लगाना होगा:
<context:component-scan base-package="com.mycompany.movies" />
यह टैग एक ऑटो-स्कैनिंग करेगा। प्रत्येक वर्ग को माना जाता है कि बीन बनना है, एक सही एनोटेशन के साथ एनोटेट किया जाता है जैसे @Component(सरल बीन के लिए) या @Controller(सर्वलेट कंट्रोल के लिए) या @Repository( DAOकक्षाओं के लिए) और ये कक्षाएं पैकेज के तहत कहीं हैं com.mycompany.movies, बसंत इन सभी को ढूंढेंगे और बनाएं हर एक के लिए एक सेम। यह कक्षाओं के 2 स्कैन में किया जाता है - पहली बार यह केवल उन कक्षाओं की खोज करता है जो एक बीन बनने की आवश्यकता होती है और उन इंजेक्शनों को मैप करते हैं जिन्हें यह करने की आवश्यकता होती है, और दूसरे स्कैन में यह बीन्स को इंजेक्ट करता है। बेशक, आप अपनी सेम को अधिक पारंपरिक XML फ़ाइल में या @Configuration क्लास (या तीनों के किसी भी संयोजन) के साथ परिभाषित कर सकते हैं ।
@Autowiredएनोटेशन स्प्रिंग बताता है जहां एक इंजेक्शन होने की जरूरत है। यदि आप इसे एक विधि पर रखते हैं, तो setMovieFinderयह समझता है (उपसर्ग set+ @Autowiredएनोटेशन द्वारा) कि एक बीन को इंजेक्ट करने की आवश्यकता है। दूसरे स्कैन में, स्प्रिंग एक प्रकार की फलियों की खोज करता है MovieFinder, और यदि वह इस तरह की बीन पाता है, तो वह इसे इस विधि में इंजेक्ट करता है। यदि यह दो ऐसे फलियां पाता है तो आपको ए Exception। इससे बचने के लिए Exception, आप @Qualifierएनोटेशन का उपयोग कर सकते हैं और यह बता सकते हैं कि दोनों बीन्स में से किसको निम्न तरीके से इंजेक्ट करना है:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
या यदि आप अपने XML में सेम घोषित करना पसंद करते हैं, तो यह कुछ इस तरह दिखाई देगा:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
में @Autowiredघोषणा, आप भी जोड़ने की जरूरत है @Qualifierजो दो रंग सेम के इंजेक्षन करने के लिए बताने के लिए:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
यदि आप दो एनोटेशन (ए @Autowiredऔर @Qualifier) का उपयोग नहीं करना चाहते हैं, तो आप @Resourceइन दोनों को संयोजित करने के लिए उपयोग कर सकते हैं :
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
@Resource(आप इस जवाब पर पहली टिप्पणी में इसके बारे में कुछ अतिरिक्त डेटा पढ़ सकते हैं) आप दो एनोटेशन के उपयोग के पुर्जों और इसके बजाय आप केवल एक का उपयोग करें।
मैं अभी दो और टिप्पणियाँ जोड़ूंगा:
- अच्छा अभ्यास
@Injectइसके बजाय उपयोग करना होगा @Autowiredक्योंकि यह स्प्रिंग-विशिष्ट नहीं है और मानक का हिस्सा हैJSR-330 ।
- एक और अच्छा अभ्यास एक विधि के बजाय एक कंस्ट्रक्टर पर
@Inject/ डाल दिया जाएगा @Autowired। यदि आप इसे एक कंस्ट्रक्टर पर रखते हैं, तो आप यह पुष्टि कर सकते हैं कि इंजेक्ट किए गए बीन्स शून्य नहीं हैं और जब आप एप्लिकेशन शुरू करने से बचने की कोशिश करते हैं और NullPointerExceptionजब आपको वास्तव में बीन का उपयोग करने की आवश्यकता होती है, तो तेजी से असफल हो जाते हैं ।
अपडेट : चित्र को पूरा करने के लिए, मैंने कक्षा के बारे में एक नया प्रश्न बनाया @Configuration।