2011-11-25 13 views
7

क्या @Component एनोटेशन (एनोटेशन का उपयोग कर वसंत बीन्स बनाने) के साथ <bean parent="someParent"> का उपयोग करने का कोई तरीका है?@ माता-पिता के साथ सामंजस्य?

मैं वसंत बीन बनाना चाहता हूं जिसमें @ कॉम्पोनेंट एनोटेशन का उपयोग करके "वसंत माता-पिता" है।

क्या यह संभव है?

+4

तुम सिर्फ विरासत का उपयोग नहीं कर सकते हैं? बेस क्लास में ऑटोवॉयरिंग उसी तरह काम करेगी। –

+1

@Tomasz Nurkiewicz मैं वसंत माता पिता सेम एक्सएमएल में परिभाषित किया गया है (यह "डिफ़ॉल्ट" मूल्यों के लिए कुछ संपत्ति के सेट है)। ऐसा कुछ नहीं है जिसे मैं बदल सकता हूं। – IAdapter

+0

मैं आगे मेरा विचार समझाने के लिए एक जवाब गयी। क्या आप थोड़ा और विस्तार कर सकते हैं कि यह आपकी आवश्यकताओं के अनुरूप क्यों नहीं है? एक्सएमएल में आप मूल परिभाषा क्यों नहीं बदल सकते? मैं यह टिप्पणी से माता-पिता को संदर्भित करने के लिए संभव नहीं है डर लग रहा है ... और यदि 'base' सेम के साथ या कृत्रिम' Bean' वर्ग बनाने और 'Wallace' और' ग्रोमिट के बिना, एक्सएमएल में परिभाषित किया जाएगा –

उत्तर

3

मेरी टिप्पणी के बाद, एक्सएमएल के इस टुकड़े

<bean id="base" abstract="true"> 
    <property name="foo" ref="bar"/> 
</bean> 

<bean class="Wallace" parent="base"/> 
<bean class="Gromit" parent="base"/> 

कम या ज्यादा eqivalent इस कोड (ध्यान दें कि मैं कृत्रिम Base श्रेणी का निर्माण के बाद से वसंत में सार सेम एक class जरूरत नहीं है) के लिए है:

public abstract class Base { 
    @Autowired 
    protected Foo foo; 
} 

@Component 
public class Wallace extends Base {} 

@Component 
public class Gromit extends Base {} 

Wallace और Gromit अब आम Foo संपत्ति तक पहुंच है। इसके अलावा आप इसे ओवरराइड कर सकते हैं, उदा। @PostConstruct में।

BTW मैं वास्तव में एक्सएमएल जो सेम सूखा रखने के लिए अनुमति में parent सुविधा पसंद किया, लेकिन जावा दृष्टिकोण भी क्लीनर लगता है।

- (एक संभावित कार्यान्वयन कि घटक स्कैन से इंजेक्ट किया गया था के लिए context.xml-घोषणा के साथ एक सामान्य सार माता पिता कक्षा जो बीन्स का इस्तेमाल किया) यह है कि मैं क्या हो सकता था है

+3

तुम्हारा उदाहरण काम नहीं करेगा घटक-स्कैन द्वारा बनाया जाएगा। –

0

बस एक ही निर्माण .. में आए @Component कक्षा में किया:

@Autowired 
public void setBeanUsedInParent(BeanUsedInParent bean) { 
    super.setBeanUsedInParent(bean); 
} 

..what मैं कर (बेहतर है, क्योंकि यह स्पष्ट करता है कि इंजेक्शन कक्षाओं पर नहीं वस्तु पर काम करता है) समाप्त हो गया है - और आप को संशोधित करने में सक्षम हैं, तो अभिभावक वर्ग:

// abstract getter in parent Class 
public abstract BeanUsedInParent getBeanUsedInParent(); 
वास्तविक बीन्स ..leave

के साथ ही वास्तविक क्रियान्वयन (@Component कक्षा) तक उनके इंजेक्शन:

@Autowired 
private BeanUsedInParent beanUsedInParent; 

@Override 
public BeanUsedInParent getBeanUsedInParent() { 
    return this.beanUsedInParent; 
} 
संबंधित मुद्दे