2009-04-28 22 views
6

जावा वसंत का उपयोग कर रनटाइम पर एक बीन के गुणों को गतिशील रूप से कैसे बदलूं? मेरे पास एक बीन मुख्य दृश्य है, जिसे संपत्ति "वर्ग" या तो "कक्षा 1" या "कक्षा 2" के रूप में उपयोग करना चाहिए। यह निर्णय किसी संपत्ति-फ़ाइल के आधार पर किया जाना चाहिए, जहां "withmartcard" संपत्ति "वाई" या "एन" है।गतिशील रूप से वसंत बीन्स

ApplicationContext:

<bean id="mainView" 
    class="mainView"> 
    <property name="angebotsClient" ref="angebotsClient" /> 
    <property name="class" ref="class1" /> 
</bean> 



<bean id="class1" 
    class="class1"> 
    <constructor-arg ref="mainView" /> 
</bean> 

<bean id="class2" 
    class="class2"> 
    <constructor-arg ref="mainView" /> 
</bean> 

PropertyFile:

withSmartcard = Y

उत्तर

1

उपयोग वर्ग कारखाने। जो आपकी संपत्ति के आधार पर उदाहरण लौटा सकता है।

10

अपने गुण फाइल प्रबंधन के लिए एक PropertyPlaceHolder का प्रयोग करें ..

<bean id="myPropertyPlaceHolder" 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <description>The service properties file</description> 
    <property name="location" value="classpath:/some.where.MyApp.properties" /> 
    </bean> 

और इस प्रकार अपने रेफरी विशेषता बदली:

<bean id="mainView" 
    class="mainView"> 
    <property name="angebotsClient" ref="angebotsClient" /> 
    <property name="class" ref="${withSmartCardClassImplementation}" /> 
</bean> 

अपने गुण में दाखिल some.where.MyApp.properties, एक जोड़ने कुंजी नाम के साथ SmartCardClassImplementation जिसमें क्लास 1 या कक्षा 2 (आप चुनते हैं) मूल्य के लिए होगा।

withSmartCardClassImplementation=class1 
+0

क्या यह {$ classIdToBeUsed} या $ {classIdToBeUsed} होना चाहिए? –

+0

$ {classIdToBeUsed} :) टाइपो, धन्यवाद! जाहिर है, मैं KISS :) – Olivier

1

मेरा मानना ​​है कि आप एक वर्ग है कि BeanFactoryPostProcessor लागू करता है लिख सकते हैं। यदि इस वर्ग का एक बीन एक्सएमएल कॉन्फ़िगरेशन फ़ाइल (आपके अन्य बीन्स के साथ) में मौजूद है, तो वसंत स्वचालित रूप से postProcessBeanFactory(ConfigurableListableBeanFactory) विधि को कॉल करेगा। ConfigurableListableBeanFactory इस विधि को सौंपी गई ऑब्जेक्ट का इस्तेमाल स्प्रिंग जाने से पहले किसी भी बीन परिभाषाओं को बदलने के लिए किया जा सकता है।

4

आप PropertyPlaceholderConfigurer चाहते हैं। मैनुअल का वह अनुभाग स्पॉट पर जितना संभव हो उतना बेहतर दिखाता है।

आपके उदाहरण में, आपको या तो संपत्ति के मूल्य को class1 या class2 (वसंत संदर्भ में वांछित बीन का नाम) बदलने की आवश्यकता होगी।

वैकल्पिक रूप से, आपके विन्यास हो सकता है:

<bean id="mainView" 
    class="mainView"> 
    <property name="angebotsClient" ref="angebotsClient" /> 
    <property name="class"> 
     <bean class="${classToUse}"> 
      <constructor-arg ref="mainView"/> 
     </bean> 
    </property> 
</bean> 
विन्यास युक्त फ़ाइल के साथ

: classToUse = fully.qualified.name.of.some.Class

सेम या वर्ग के नाम का उपयोग नहीं होगा उपयोगकर्ता-संपादन योग्य कॉन्फ़िगरेशन फ़ाइल में स्वीकार्य है, और आपको वास्तव में कॉन्फ़िगरेशन पैरामीटर मान के रूप में "वाई" और "एन" का उपयोग करने की आवश्यकता है। उस स्थिति में, आपको जावा में ऐसा करना होगा, वसंत ट्यूरिंग-पूर्ण होने का मतलब नहीं है।

mainView सीधे आवेदन संदर्भ पहुंच सकता है:

if (this.withSmartCards) { 
    this.class_ = context.getBean("class1"); 
} else { 
    this.class_ = context.getBean("class2"); 
} 

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

BeanFactoryPostProcessor का उपयोग करके, आप कक्षा संपत्ति प्रोग्रामेटिक रूप से परिभाषा पंजीकृत कर सकते हैं।FactoryBean का उपयोग करके, आप एक बीन गतिशील रूप से बना सकते हैं। दोनों स्प्रिंग के कुछ हद तक उन्नत उपयोग हैं।

एक तरफ: मुझे यकीन नहीं है कि आपकी उदाहरण कॉन्फ़िगरेशन कानूनी है, मुख्यव्यू और कक्षा 1/कक्षा 2 के बीच चक्रीय निर्भरता के कारण।

1

उपरोक्त @ ओलिवियर के साथ सहमत हैं।

ऐसा करने के कई तरीके हैं।

  1. PropertyPlaceHolderConfigurer उपयोग ..
  2. BeanPostProcessor उपयोग ..
  3. उपयोग स्प्रिंग AOP, एक सलाह बना सकते हैं और गुण में हेरफेर।

मैं ऊपर आइटम नंबर 1 की सिफारिश करता हूं।

+0

Yup के साथ क्लास IDToBeUsed को बदलता हूं :) सरल और आसानी से प्रबंधित .. – Olivier

+0

Yup के कारण, SmartCardClassImplementation – Satya

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