2012-10-26 15 views
6

मौजूद है मैं वसंत संदर्भ फ़ाइलों के निम्नलिखित संरचना ('शामिल' के लिए -> खड़ा है):एक सेम इंजेक्षन कैसे केवल जब यह

A1.xml -> B.xml & C.xml 
A2.xml -> B.xml 

C.xml एक सेम c

B.xml एक सेम को परिभाषित करता है परिभाषित करता है c

जाहिर है इस ए 2 के लिए विफल रहता है, क्योंकि वहाँ कोई c संदर्भ में परिभाषित पर निर्भरता के साथ bA2 यदि आप संदर्भ में cb में यह इंजेक्षन है अन्यथा सिर्फ null इंजेक्षन:

मैं कैसे की तरह कुछ निर्दिष्ट कर सकते हैं?

मैं वसंत ईएल में देखा लेकिन

<property name="b" ref="#{ @c?:null}" /> 

बस मुझे एक नाम जो b.toString() का मूल्य लग रहा था के लिए एक NoSuchBeanDefinitionException दिया!?

बीटीडब्ल्यू: मुझे पहले से ही पता है कि यह चीज़ नरक के रूप में गन्दा है और जितनी जल्दी हो सके साफ किया जाना चाहिए।

उत्तर

16

स्पेल अभिव्यक्ति का #root ऑब्जेक्ट एक बीनएक्सप्रेस कॉन्टेक्स्ट है, आप उस संदर्भ पर getObject() विधि का आह्वान कर सकते हैं; यह शून्य वापस लौट आता है सेम घोषित नहीं किया गया है ...

<property name="bar" value="#{getObject('bar')}" /> 

नोट: क्योंकि यह सेम, नहीं सेम परिभाषा देता है आप value नहीं ref का उपयोग करें।

यहाँ getObject()

public Object getObject(String key) { 
    if (this.beanFactory.containsBean(key)) { 
     return this.beanFactory.getBean(key); 
    } 
    else if (this.scope != null){ 
     return this.scope.resolveContextualObject(key); 
    } 
    else { 
     return null; 
    } 
} 
6

मैं काफी अपने XML सफाई :-)

आप एनोटेशन आधारित इंजेक्शन उपयोग कर रहे हैं के साथ सहमत हैं, तो आप की कोशिश कर सकते this trick

@Autowired(required=false) 

मैं अनिश्चित हैं कि यह अपनी स्थिति में काम करेंगे हूँ , लेकिन यह एक कोशिश के लायक है।

+0

से कोड मैं xml करने के लिए बाध्य कर रहा हूँ है: - / –