2012-02-02 7 views
26

के बीच अंतर मुझे दो तरीकों के बीच कोई अंतर नहीं दिखता है, @Qualifier हमेशा @Autowired के साथ उपयोग किया जाता है।@Qualifier और @Resource

@Autowired 
@Qualifier("alpha") 

वी.एस.

@Resource(name="alpha") 

किसी को भी मुझे फर्क पता है सकता है? धन्यवाद!

+0

[@ संसाधन बनाम @Autowired] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/4093504/resource-vs-autowired) – skaffman

उत्तर

49

@Autowired अकेले इस्तेमाल किया जा सकता है। यदि यह अकेले उपयोग किया जाता है, तो इसे प्रकार से तारित किया जाएगा। इसलिए समस्याएं उत्पन्न होती हैं यदि @Autowired के रूप में कंटेनर में एक ही प्रकार के एक से अधिक बीन घोषित किए जाते हैं, तो यह नहीं पता कि कौन से सेम इंजेक्ट करने के लिए उपयोग करते हैं। नतीजतन, @Qualifier एक साथ उपयोग @Autowired साथ स्पष्ट करने के लिए जो सेम वास्तव में सेम का नाम (नाम से तार)

@Resource नाम से भी तार है निर्दिष्ट द्वारा तार हो सकते हैं। तो यदि @Autowired@Qualifier के साथ एक साथ उपयोग किया जाता है, तो यह @Resource जैसा ही है।

अंतर यह है कि @Autowired और @Qualifier वसंत एनोटेशन हैं जबकि @Resource मानक जावा एनोटेशन (जेएसआर-250 से) है। इसके अलावा, @Resource केवल फ़ील्ड और सेटर इंजेक्शन के लिए समर्थन करता है जबकि @Autowired फ़ील्ड, सेटर, कन्स्ट्रक्टर और बहु-तर्क विधियों इंजेक्शन का समर्थन करता है।

फ़ील्ड और सेटर इंजेक्शन के लिए @Resource का उपयोग करने का सुझाव दिया जाता है। कन्स्ट्रक्टर या बहु-तर्क विधि इंजेक्शन के लिए और @Autowired के साथ चिपकाएं।

this देखें:

आप नाम से एनोटेशन चालित इंजेक्शन व्यक्त करने के लिए करना चाहते हैं, मुख्य रूप से @Autowired का उपयोग नहीं है - भले ही @Qualifier मूल्यों के माध्यम से एक सेम नाम के चर्चा करते हुए की तकनीकी रूप से सक्षम है। इसके बजाए, JSR-250 @ संसाधन एनोटेशन को प्राथमिकता दें जिसे विशिष्ट लक्ष्य घटक को अपने अद्वितीय नाम से चिह्नित किया गया है, घोषित प्रकार मिलान प्रक्रिया के लिए अप्रासंगिक है।

+0

में स्वचालित रूप से @ ऑटोवायर के बजाय @ संसाधन का उपयोग करना चाहिए, यह वास्तव में कहां कहता है? मैं देखता हूं कि अगर आप नाम से ऑटोवायर करना चाहते हैं तो इसका उपयोग करना है, मुझे नहीं लगता कि यह कहां सिफारिश की जाती है कि संसाधन को प्राथमिकता दी जाती है (और यह वास्तव में कुछ परिस्थितियों में काम नहीं करेगा)। –

+0

अपडेट किया गया। यह 3.11.3 में टिप्स अनुभाग में कहा गया है –

3

@Autowired पुराना स्कूल वसंत है। @Resource जावा ईई सीडीआई मानक है। वसंत दोनों (साथ ही @ इंजेक्ट, जो बहुत समान है) को संभालता है और दोनों परिस्थितियों में काफी कुछ करता है। मैं @Resource की सिफारिश करता हूं, @Autowired मानक से पहले बनाया गया था और ज्यादातर पिछड़े संगतता के लिए समर्थित है।

+0

तो आपका मतलब है कि संसाधन वर्तमान वसंत मानक है। हमें अपने स्प्रिंग बीन्स –

4

मैं @Autowired के साथ कुछ मुद्दों का सामना करना पड़ गया था और तब @Qualifier उपयोग शुरू कर दिया है और मैं अंत में पता लगाने के लिए जब @Qualifier साथ @Autowired उपयोग करने के लिए जब एक ही प्रकार के अनेक सेम परिभाषित कर रहे हैं सक्षम था।

मान लीजिए आप एक ही प्रकार लेकिन विभिन्न मूल्यों के 2 सेम को परिभाषित:

<bean id="appContext1" class="com.context.AppContext"> 
    <constructor-arg value="abc" /> 
<bean/> 
<bean id="appContext2" class="com.context.AppContext"> 
    <constructor-arg value="ABC" /> 
<bean/> 
फिर

तुम सिर्फ @Autowire उपयोग करने के लिए कोशिश कर रहे हैं, तो आप किसी और यह सेम नाम के रूप में एक ही चर नाम का उपयोग करना कई प्रकार के रूप में त्रुटि मिलेगी।

@Autowired 
AppContext appContext; 

उपरोक्त उपयोग के मामले के लिए आपको क्वालीफायर का उपयोग करना होगा।

@Autowired 
@Qualifier("appContext1") 
AppContext appContext; 

इसके बजाय, यदि आप चर नाम सेम नाम के रूप में एक ही उपयोग करते हैं, आप @Qualifier के उपयोग को समाप्त कर सकते हैं।

@Autowired 
AppContext appContext1; 

मैं हमेशा चर नाम सेम नाम के रूप में एक ही उपयोग कर रहा था, लेकिन गलती से कुछ अन्य चर नाम था और इस मुद्दे का सामना करना पड़ा।

मुझे कोई संदेह है तो मुझे बताएं।

संबंधित मुद्दे