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


695

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

यहाँ कोड का टुकड़ा है:

@Inject private CustomerOrderService customerOrderService;

मुझे यकीन है कि नहीं के बीच अंतर के बारे में हूँ @Injectऔर @Autowiredऔर इसकी सराहना अगर किसी को उनके अंतर समझाया जाएगा और जो एक क्या स्थिति के तहत उपयोग करने के लिए?


3
मेरे पास कोई जवाब नहीं है, क्योंकि मैं भी इसके लिए नया हूं, लेकिन इससे sakaenakajima.wordpress.com/2010/08/10/…
सागर V


जवाबों:


720

यहां मान लें कि आप javax.inject.Injectएनोटेशन का उल्लेख कर रहे हैं । जावा EE 6 (JSR-299) में शुरू किए @Injectगए जावा CDI ( Contexts and Dependency Injection ) मानक का हिस्सा है, और पढ़ें । स्प्रिंग ने @Injectअपने स्वयं के @Autowiredएनोटेशन के साथ पर्यायवाची रूप से समर्थन करने के लिए चुना है ।

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


115
तो सिद्धांत में यदि आपने @ इस्तेमाल किया है तो आप स्प्रिंग को दूसरे DI फ्रेमवर्क जैसे Guice से बदल सकते हैं और अपनी निर्भरता को उसी तरह से इंजेक्ट कर सकते हैं।
एलेक्स बार्न्स

71
पांडित्य होने के खतरे में: @InjectCDI (JSR-299) से एक अलग JSR (JSR-330) है।
ब्रैड कपिट

36
यदि आप केवल JSR- * एनोटेशन पर निर्भर हैं, तो सुनिश्चित करें कि आप DI फ्रेमवर्क को बदल सकते हैं । पर करोगे क्या? एक बार जब आप वसंत का उपयोग करना शुरू कर देते हैं, तो संभावना है कि आपने इसे केवल DI की तुलना में बहुत अधिक उपयोग किया है। आप सिर्फ एक बदलाव नहीं करेंगे; और यहां तक ​​कि अगर तुम करते हो, यह कुछ खोज और प्रतिस्थापन नहीं है जो इस कदम को बनाने या तोड़ने के लिए जा रहा है। दूसरी ओर, स्प्रिंग की अपनी टिप्पणियां आपको बहुत अधिक कार्यक्षमता प्रदान करती हैं। एक अच्छा ढांचा तैयार करना आपको बहुत से उपयोग करने की तुलना में शायद ही अधिक देगा।
अगस्टोन होर्वाथ

18
मैं आपसे सहमत हूं कि हम DI के ढांचे को अक्सर नहीं बदलते हैं। हालाँकि यदि हमारे सोर्स कोड में कई पैकेज हैं और यदि आप एक सामान्य पैकेज बनाना चाहते हैं, जिसे आप कई प्रोजेक्ट्स में साझा करना चाहते हैं और फिर @InjectJSR एनोटेशन के साथ जाना बेहतर है, @Autowiredजिसके उपयोग से स्प्रिंग DI के साथ आपका कोड बेस लॉक हो जाता है।
आदित्य

3
@Injectअकेले प्रयोग से फ्रेमवर्क की स्वतंत्रता सुनिश्चित नहीं होगी। आपको स्प्रिंग के @Componentया जैसे फ्रेमवर्क पर निर्भर तंत्र के बिना इंजेक्टेबल बीन्स की घोषणा करने की आवश्यकता होगी application.xml, लेकिन उपयोग @Namedऔर @Singletonवर्ग स्तर पर। कोई विचार नहीं अगर कोई स्प्रिंग प्रोजेक्ट वास्तव में आज की तरह सेम घोषित करता है - मैंने कभी भी किसी भी परियोजना के बारे में नहीं सुना है जो स्प्रिंग से जेईई में स्थानांतरित हो गया ...
मार्कस के।

162

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

लिंक से:

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

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

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


4
वह लेख तीन एनोटेशन का एक बड़ा विवरण है। पहले स्वाइप के बाद मुझे इसे दोबारा पढ़ना पड़ा; लेकिन, एक उत्कृष्ट लेख।
थॉमस

1
आपका बहुत बहुत धन्यवाद! लेख ने स्प्रिंग और जावाईई के बीच अंतर और समानता खोजने की मेरी खोज में मेरे कई जवाब दिए, साथ ही साथ कुछ अन्य प्रश्न भी थे।
केविन क्रूज़सेन

36

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

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


8
यह बहुत महत्वपूर्ण है, और सबसे अधिक उत्तर दिए गए उत्तरों में इसकी अनदेखी की गई है।
इगोर डोनिन

डिफ़ॉल्ट रूप से आवश्यक पैरामीटर ऑटोवार्ड के लिए सही पर सेट है। रेफरी: docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
शांत

25

स्प्रिंग 3.0 के रूप में, वसंत प्रस्तावों JSR-330 निर्भरता इंजेक्शन एनोटेशन के लिए समर्थन ( @Inject, @Named, @Singleton)।

उनके वसंत समकक्षों की तुलना सहित, उनके बारे में वसंत प्रलेखन में एक अलग खंड है


यहाँ सवाल है, जब आप कहते हैं कि स्प्रिंग जेएसआर का समर्थन करता है तो आपका क्या मतलब है? क्या कंटेनर जेएसआर स्प्रिंग से स्वतंत्र नहीं है, और कंटेनर को जे 2 ईई के अनुरूप होने की आवश्यकता है? क्या आपका मतलब है कि यह कार्यक्षमता को लपेटता है? यदि स्प्रिंग ने इसका "समर्थन" नहीं किया, तो क्या javax से एनोटेशन अभी भी डिफ़ॉल्ट रूप से काम नहीं करेगा?
दान चेस

स्प्रिंग को जेईई कंटेनर में चलाना आवश्यक नहीं है, आप इसे टॉम्केट की तरह सर्वलेट / जेएसपी कंटेनर में भी उपयोग कर सकते हैं और अभी भी जेएसआर -३३० का समर्थन है। स्प्रिंग एक अलग डीआई कंटेनर है, यह मेजबान जेईई सर्वर के साथ सीडीआई बीन्स को "इंटरचेंज" नहीं करता है यदि इसका मतलब है कि आपका क्या मतलब है। आप या तो जेईई कंटेनर, या स्प्रिंग बीन्स में सीडीआई का उपयोग कर सकते हैं - लेकिन आप दोनों (बॉक्स से बाहर) का उपयोग नहीं कर सकते हैं।
आंद्रे स्टिंग्रेस

22

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


क्या आप आवश्यकता से मतलब है?
गणितज्ञ

2
@mattymanme डॉक्स से, "डिफ़ॉल्ट रूप से, जब भी शून्य उम्मीदवार बीन्स उपलब्ध होते हैं, तो ऑटोवॉयरिंग विफल हो जाती है; डिफ़ॉल्ट व्यवहार एनोटेट किए गए तरीकों, कंस्ट्रक्टर्स और फ़ील्ड को आवश्यक निर्भरता का संकेत देने के रूप में व्यवहार करता है। इस विशेषता को झूठे के लिए आवश्यक विशेषता सेट करके बदला जा सकता है। "। जैसे:। @Autowired(required=false)साधारण शब्दों में, " requiredविशेषता इंगित करती है कि संपत्ति को स्वत: प्राप्त करने के उद्देश्यों के लिए आवश्यक नहीं है, संपत्ति को नजरअंदाज नहीं किया जा सकता है यदि यह स्वत: बंद नहीं किया जा सकता है।"
लकी

स्रोत कोड सार्वजनिक इंटरफ़ेस में देखें Autowired {/ ** * घोषणा करता है कि क्या एनोटेट निर्भरता की आवश्यकता है। * (बूलियन आवश्यक) (डिफ़ॉल्ट सच; } सार्वजनिक इंटरफ़ेस इंजेक्षन {}
tarn

15

हर समय @Inject का बेहतर उपयोग करें। क्योंकि यह जावा कॉन्फ़िगरेशन अप्रोच (सूर्य द्वारा प्रदान किया गया) है जो हमारे एप्लिकेशन को फ्रेमवर्क के लिए अज्ञेय बनाता है। इसलिए यदि आप वसंत भी अपने वर्ग काम करेंगे।

यदि आप @Autowired का उपयोग करते हैं तो यह केवल स्प्रिंग के साथ काम करेगा क्योंकि @Autowired स्प्रिंग एनोटेशन है।


13
सूरज मर चुका है। सूर्य को दीर्घायु करें।
अमरिंदर अरोरा

6
आप कितनी बार रूपरेखा बदलने जा रहे हैं? बस जिज्ञासु
Kay

अधिकांश परियोजनाओं पर मैंने Inject के बजाय Autowired को देखा। मैं उत्तर के औचित्य को समझता हूं लेकिन मैं उत्थान नहीं कर सकता।
विटोल्ड काकज़ुरबा

13

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

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

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

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

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

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


भले ही attribute @ इंजेक्ट ’के पास जावा डॉक्स स्टेट्स की एक आवश्यक विशेषता नहीं है: is @ इंजेक्ट’ के साथ एनोटेट किए गए सदस्यों के इंजेक्शन की आवश्यकता है। जिसका अर्थ यह लगता है कि यदि कोई सदस्य नहीं पाया गया तो उसका इंजेक्शन विफल हो जाएगा। जावा डॉक्स देखें: docs.oracle.com/javaee/7/api/javax/inject/Inject.html
एलेक्स थिंकिंग


12

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

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

0

@Injectएनोटेशन JSR-330 एनोटेशन संग्रह में से एक है। इसमें टाइप बाय मैच, क्वालिफायर द्वारा मैच, नाम निष्पादन मार्गों द्वारा मैच है। ये निष्पादन पथ सेटर और फ़ील्ड इंजेक्शन दोनों के लिए मान्य हैं। @Autowiredएनोटेशन का व्यवहार एनोटेशन के समान है @Inject। एकमात्र अंतर यह है कि @Autowiredएनोटेशन स्प्रिंग फ्रेमवर्क का एक हिस्सा है। @Autowiredएनोटेशन में उपरोक्त निष्पादन पथ भी हैं। इसलिए मैं @Autowiredआपके उत्तर के लिए सलाह देता हूं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.