java - वसंत फ्रेमवर्क में @ इंजेक्ट और @Autowired के बीच क्या अंतर है? किस स्थिति के तहत उपयोग करने के लिए कौन सा?
spring annotations (7)
उपरोक्त के अतिरिक्त:
- @Autowired सेम के लिए डिफ़ॉल्ट दायरा सिंगलटन है जबकि जेएसआर 330 @ इंजेक्शन एनोटेशन का उपयोग यह वसंत के
prototype
की तरह है। - @ इंजेक्ट का उपयोग कर JSR 330 में @Lazy के बराबर नहीं है
- @ इंजेक्ट का उपयोग कर जेएसआर 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
में कोई 'आवश्यक' विशेषता नहीं है