2011-04-07 22 views
5

को देखते हुए मैं एक वसंत सेम इस सेमकैसे नाम से वसंत सेवा सेम अधिलेखित करने के लिए, एनोटेशन का उपयोग केवल

public class Consumer { 
    @Autowired 
    @Qualifier("myService") 
    private MyService service; 
    ... 
} 

अब मैं अपने परियोजना चाहते का उपयोग कर

@Service("myService") 
public class DefaultService extends MyService { 
} 

और एक वर्ग के रूप में विन्यस्त है, कि ConsumerMyService इंजेक्शन होने के बाद एक और कार्यान्वयन के लिए पिछले कक्षाएं शामिल हैं। इसलिए मैं सेम myService

@Service("myService") 
public class SpecializedService implements MyService { 
} 

Consumer में जिसके परिणामस्वरूप अब SpecializedService बजाय DefaultService का एक उदाहरण ले जाने के ऊपर लिख करना चाहते हैं। परिभाषा के अनुसार मेरे पास वसंत कंटेनर में एक ही नाम के साथ दो सेम नहीं हो सकते हैं। मैं वसंत कैसे कह सकता हूं कि नई सेवा की परिभाषा पुराने व्यक्ति को ओवरराइट कर देगी? मैं Consumer कक्षा को संशोधित नहीं करना चाहता हूं।

उत्तर

2

या तो परिभाषित सेवा सेम स्पष्ट

<bean id="myService" class="x.y.z.SpecializedService" /> 

या यह घटक-स्कैन।

किसी भी घटना में, आपके आवेदन संदर्भ में, डिफ़ॉल्ट सेवा को स्पष्ट रूप से परिभाषित करने से बचें और घटक स्कैनिंग से बचें।

+0

धन्यवाद, विली। हमने आपके समाधान के साथ समाप्त किया क्योंकि हमने एक सेवा में प्रत्येक सेवा की सूची रखने के लिए रखरखाव के कारणों (हम सैकड़ों सेवाओं के बारे में बात कर रहे हैं) के लिए भी निर्णय लिया है - अर्थात् वसंत बीन कॉन्फ़िगरेशन। केवल आईडी और वर्गनाम को परिभाषित करना बहुत दर्दनाक नहीं है क्योंकि एनोटेशन का उपयोग केवल अधिक आकर्षक है। –

2

अगर वहाँ केवल एनोटेशन के साथ यह करने के लिए एक तरह से (DefaultService से @Service एनोटेशन को दूर करने के अलावा अन्य) है एक फिल्टर

<component-scan base-package="your-package"> 
    <exclude-filter type="regex" expression="DefaultService" /> 
</component-scan> 

सुनिश्चित नहीं हैं का उपयोग करके घटक स्कैन से यह बाहर निकालें।

+0

धन्यवाद, विल्हेल्म, मुझे यकीन है कि आपका समाधान काम करेगा। लेकिन फिर मुझे अपनी सेवाओं के लिए स्कैन करना होगा। अच्छा विचार! –

0

एनोटेशन आधारित वायरिंग एक्सएमएल आधारित कॉन्फ़िगरेशन से पहले होती है, जिसका मतलब है कि एक्सएमएल में परिभाषित बीन्स एनोटेशन द्वारा किए गए तारों को ओवरराइट करेंगे। तो, एक्सएमएल में स्पष्ट रूप में यह परिभाषित करने विली की तरह काम

<bean id="myService" class="x.y.z.SpecializedService" /> 

वसंत MVC सेम के लिए सेवा और भंडार सेम और टिप्पणी के लिए XML का उपयोग की सिफारिश की कोशिश करेंगे ने कहा है। यह बिना घटक स्कैनिंग के @Autowired की भी सिफारिश करता है। लेकिन एनोटेशन को सामान्य रूप से प्रोत्साहित किया जाता है, हालांकि यह कोड और कॉन्फ़िगरेशन को एक साथ विलय करता है (चिंताओं के पृथक्करण के खिलाफ)।

दूसरी बात @Qualifiers ("घोषित बीन की आईडी") का उपयोग करना है जहां इसे पारित किया जा रहा है।

-2

मुझे पता है, देर हो चुकी है। अभी भी इसे पोस्ट कर रहा है।

आपके पास MyService के विभिन्न कार्यान्वयन के लिए अलग-अलग नाम होना चाहिए।

उदाहरण

@Service("mySpecializedService") 
public class SpecializedService implements MyService { 
} 

@Service("myService") 
public class DefaultService extends MyService { 
} 

के लिए उन्हें autowiring जबकि (नियंत्रक में कहते हैं), आप इच्छित कार्यान्वयन सुई नीचे वर्णित के रूप में @Qualifier उपयोग कर सकते हैं।

डिफ़ॉल्ट कार्यान्वयन

@Autowired 
@Qualifier("myService") 
MyService myService; 

प्राप्त करने के लिए विशेष कार्यान्वयन प्राप्त करने के लिए

@Autowired 
@Qualifier("mySpecializedService") 
MyService myService; 
+0

यह ओपी के लिए पूछे जाने वाले बिल्कुल विपरीत है। –

+0

@ हिमांशु भार्डवाज .. क्या आप अपना दृष्टिकोण साझा कर सकते हैं ..? – user6087330

+0

मैं एक अलग कॉन्फ़िगरेशन फ़ाइल (एक्सएमएल या जावा) में दूसरे पर नए बीन को परिभाषित करता, और इसे पिछले एक को ओवरराइड करने देता, या स्प्रिंग प्रोफाइल या @ कंडिशन के साथ आगे बढ़ता। –

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

  • कोई संबंधित समस्या नहीं^_^