2014-10-23 7 views
5

मान लीजिए कि आपके वसंत संदर्भ फ़ाइल में आपने कुछ संदर्भ फ़ाइलों को आयात किया है जिन्हें आप संशोधित नहीं कर सकते हैं।वसंत - एक अलग संदर्भ फ़ाइल से आयातित बीन्स पर गुण सेट करें

क्या आयातित सेम के गुणों को सेट करने का कोई तरीका है? मैं आयातित संदर्भ फ़ाइलों से बीन परिभाषा को कॉपी और पेस्ट नहीं करना चाहता हूं और इसे संशोधित नहीं करना चाहता क्योंकि यह मेरे कोड और बाहरी पुस्तकालय के बीच गलत निर्भरता पैदा करेगा।

मुझे बस मौजूदा बीन की एक संपत्ति को संशोधित करने की आवश्यकता है।

यह सिद्धांत में संभव होना चाहिए कि मैं इसे एक कस्टम क्लास का उपयोग करके कर सकता हूं जो निर्भरता के रूप में अद्यतन करने के लिए बीन प्राप्त करता है और init-method में अपनी गुणों को संशोधित करता है।

मुझे आश्चर्य है कि स्प्रिंग में ऐसा करने के लिए मानक वाक्यविन्यास है या नहीं।

<bean id="the.message" class="com.someco.SomeClass"> 
    <property name="message" value="default message" /> 
</bean> 

मैं इस एक बाहरी निर्भरता के रूप में आयात और इसलिए मैं इस परिभाषा को संशोधित करने का विकल्प नहीं है:

पुस्तकालय-context.xml में उदाहरण के लिए वहाँ निम्नलिखित सेम परिभाषा है।

बेशक मैं इस संदर्भ को अपने संदर्भ में कॉपी और पेस्ट कर सकता हूं और इसे ओवरराइड कर सकता हूं। उदाहरण के लिए एक बीन के साथ यह ठीक होगा कि यह बहुत आसान है। समस्या यह है कि अक्सर निर्भरता अधिक जटिल होती है और वे पुस्तकालय के एक अलग संस्करण में बदल सकते हैं।

मैं चाहता हूं कि अन्य सभी विवरणों को अनदेखा करने के लिए बीन "the.message" की संपत्ति सेट करना है।

मैं की तरह कुछ का उपयोग करने के बारे में सोच रहा हूँ:

<bean id="myproxy" class="com.myapp.Proxy" init-method="copyProperties"> 
    <property name="proxied" value="the.message" /> 
    <property name="message" value="my message" /> 
</bean> 

यह "प्रॉक्सी" केवल "the.message" के गुणों को सेट किया जाता है।

+0

संभव डुप्लिकेट [मैं एक जगह ले सकता है रनटाइम पर स्प्रिंग बीन परिभाषा?] (Http://stackoverflow.com/questions/4041300/can-i-replace-a-spring-bean-definition-at-runtime) –

+5

यह नहीं देखता मैं एक ही समस्या हूँ। मैं रनटाइम पर इसे बदलना नहीं चाहता हूं। मुझे केवल अपनी संदर्भ फ़ाइल में एक संपत्ति सेट करने की आवश्यकता है। –

उत्तर

0

ऐसा करने के लिए जो आप करना चाहते हैं, SomeClass को एक सेटटर होना चाहिए। आप आमतौर पर बीन इंजेक्ट करेंगे जैसा कि आप सामान्य रूप से करेंगे और उस सेटर का उपयोग करेंगे। एनोटेशन का उपयोग करना आसान होगा लेकिन एक्सएमएल के साथ भी कामयाब होगा।

हालांकि, सुनिश्चित करें कि आप महसूस करते हैं कि ऐसा करने से वैश्विक स्तर पर बीन का मूल्य बदल जाएगा। अगर कुछ मूल मूल्य पर निर्भर था, तो यह अब अस्तित्व में नहीं रहेगा।

0

मुझे विश्वास है कि यह आपकी आयात संदर्भ फ़ाइल में org.springframework.beans.factory.config.MethodInvokingFactoryBean का उपयोग करके किया जा सकता है।

अपने उदाहरण से आयात परिभाषा का उपयोग करना:

<bean id="the.message" class="com.someco.SomeClass"> 

संदेश इस तरह आयात संदर्भ फ़ाइल में सेट किया जा सकता:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="the.message" /> 
    <property name="targetMethod" value="setMessage" /> 
    <property name="arguments"> 
     <list> 
      <value type="java.lang.String">This message was set in importing context file</value> 
     </list> 
    </property> 
</bean> 
की
संबंधित मुद्दे