टी एल; डॉ
@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
।