java - वसंत फ्रेमवर्क में @ इंजेक्ट और @Autowired के बीच क्या अंतर है? किस स्थिति के तहत उपयोग करने के लिए कौन सा?




spring annotations (7)

उपरोक्त के अतिरिक्त:

  1. @Autowired सेम के लिए डिफ़ॉल्ट दायरा सिंगलटन है जबकि जेएसआर 330 @ इंजेक्शन एनोटेशन का उपयोग यह वसंत के prototype की तरह है।
  2. @ इंजेक्ट का उपयोग कर JSR 330 में @Lazy के बराबर नहीं है
  3. @ इंजेक्ट का उपयोग कर जेएसआर 330 में @ वैल्यू के बराबर नहीं है

मैं स्प्रिंगसोर्स पर कुछ ब्लॉगों के माध्यम से जा रहा हूं और ब्लॉग लेखक में से एक में @Inject का उपयोग कर रहा है और मुझे लगता है कि वह @Autowired भी उपयोग कर सकता है

कोड का टुकड़ा यहां दिया गया है:

@Inject private CustomerOrderService customerOrderService;

मैं @Inject और @Autowired बीच के अंतर के बारे में निश्चित नहीं @Autowired और अगर कोई अंतर बता सकता है और किस स्थिति में किस स्थिति का उपयोग करना है तो इसकी सराहना होगी?


ऐसी स्थिति को संभालने के लिए जिसमें तार नहीं है, बीन्स @Autowired required विशेषता सेट के साथ उपलब्ध हैं।

लेकिन @Inject का उपयोग करते @Inject , प्रदाता इंटरफ़ेस बीन के साथ काम करता है जिसका अर्थ है कि बीन सीधे इंजेक्शन नहीं है लेकिन प्रदाता के साथ।


मान लीजिए कि आप javax.inject.Inject जिक्र कर रहे हैं। एनोटेशन javax.inject.Inject@Inject जावा ईई 6 (जेएसआर -29 9) में पेश किए गए जावा सीडीआई ( संदर्भ और निर्भरता इंजेक्शन ) मानक का हिस्सा है, और पढ़ें । वसंत ने अपने स्वयं के @Autowired एनोटेशन के साथ समानार्थी रूप से @Inject का उपयोग करके समर्थन करने के लिए चुना है।

तो, अपने प्रश्न का उत्तर देने के लिए, @Autowired वसंत की अपनी (विरासत) एनोटेशन है। @Inject सीडीआई नामक एक नई जावा तकनीक का हिस्सा है जो वसंत के समान निर्भरता इंजेक्शन के लिए एक मानक परिभाषित करता है। एक स्प्रिंग एप्लिकेशन में, दो एनोटेशन उसी तरह काम करते हैं जैसे स्प्रिंग ने अपने स्वयं के अलावा कुछ जेएसआर -29 9 एनोटेशन का समर्थन करने का निर्णय लिया है।


यहां एक ब्लॉग पोस्ट है जो @Resource , @Inject , और @Autowired तुलना @Autowired , और ऐसा लगता है कि यह एक बहुत ही व्यापक काम करता है।

लिंक से:

परीक्षण 2 और 7 के अपवाद के साथ विन्यास और परिणाम समान थे। जब मैंने हुड के नीचे देखा तो मैंने निर्धारित किया कि '@Autowired' और '@Inject' एनोटेशन समान व्यवहार करते हैं। इन दोनों एनोटेशन निर्भरताओं को इंजेक्ट करने के लिए 'AutowiredAnotationBeanPostProcessor' का उपयोग करते हैं। '@Autowired' और '@Inject' का उपयोग स्प्रिंग बीन्स इंजेक्ट करने के लिए अदला-बदली किया जा सकता है। हालांकि '@ संसाधन' एनोटेशन निर्भरताओं को इंजेक्ट करने के लिए 'CommonAnnotationBeanPostProcessor' का उपयोग करता है। भले ही वे विभिन्न पोस्ट प्रोसेसर कक्षाओं का उपयोग करते हैं, वे सभी लगभग समान व्यवहार करते हैं। नीचे उनके निष्पादन पथ का सारांश है।

टेस्ट 2 और 7 कि लेखक संदर्भ 'फील्ड नाम से इंजेक्शन' और 'खराब क्वालीफायर का उपयोग करके एक बीन को हल करने का प्रयास' क्रमशः हैं।

निष्कर्ष आपको आपको आवश्यक सारी जानकारी देनी चाहिए।


@Autowired एनोटेशन स्प्रिंग ढांचे में परिभाषित किया गया है।

@Inject एनोटेशन एक मानक एनोटेशन है, जिसे मानक "जावा के लिए निर्भरता इंजेक्शन" (जेएसआर-330) में परिभाषित किया गया है। वसंत (संस्करण 3.0 के बाद से) निर्भरता इंजेक्शन के एक सामान्यीकृत मॉडल का समर्थन करता है जिसे मानक जेएसआर-330 में परिभाषित किया गया है। ( Google Guice ढांचे और Picocontainer ढांचे भी इस मॉडल का समर्थन है)।

@Inject इंजेक्ट के साथ Provider इंटरफ़ेस के कार्यान्वयन के संदर्भ को इंजेक्शन दिया जा सकता है, जो स्थगित संदर्भों को इंजेक्ट करने की अनुमति देता है।

टिप्पणियां @Inject और @Autowired - लगभग पूर्ण अनुरूपता है। साथ ही @Autowired एनोटेशन, @Inject एनोटेशन स्वचालित बाध्यकारी गुणों, विधियों, और @Inject लिए इस्तेमाल किया जा सकता है।

@Autowired एनोटेशन के विपरीत, @Inject एनोटेशन में कोई required विशेषता नहीं required । इसलिए, यदि निर्भरता नहीं मिलेगी - अपवाद फेंक दिया जाएगा।

बाध्यकारी गुणों के स्पष्टीकरण में अंतर भी हैं। यदि इंजेक्शन के लिए घटकों की पसंद में अस्पष्टता है तो @Named क्वालीफायर जोड़ा जाना चाहिए। @Autowired एनोटेशन के लिए एक समान स्थिति में @Qualifier क्वालिफायर क्वालीफायर जोड़ा जाएगा (जेएसआर-330 अपने स्वयं के @Qualifier क्वालिफायर एनोटेशन को परिभाषित करता है और इस क्वालीफायर एनोटेशन के माध्यम से @ @Named परिभाषित किया गया है)।


@Autowired और @Inject दोनों के बीच महत्वपूर्ण महत्वपूर्ण अंतर ( स्प्रिंग डॉक्स पढ़ने पर ध्यान दिया गया है), @Autowired में 'आवश्यक' विशेषता है जबकि @Inject के पास 'आवश्यक' विशेषता नहीं है।


@Inject में कोई 'आवश्यक' विशेषता नहीं है





inject