2010-02-05 5 views
7

मेरे पास स्प्रिंग फ्रेमवर्क पर बनाया गया एक एप्लीकेशन है जो डेटाबेस होस्ट स्ट्रिंग, उपयोगकर्ता नाम और पासवर्ड जैसी कुछ चीजों के लिए बाहरी गुण फ़ाइल का उपयोग करता है ताकि हम कॉन्फ़िगरेशन फ़ाइल को हमारे भंडार (यह खुला स्रोत) में देख सकें और सुरक्षा की समझौता नहीं कर सकें डीबी यह भी बहुत अच्छा है क्योंकि डेवलपर इस फ़ाइल की अपनी प्रतिलिपि रख सकते हैं और एप्लिकेशन मैन्युअल रूप से पुन: कॉन्फ़िगर करने के बजाए स्वचालित रूप से उनके सिस्टम पर कॉन्फ़िगरेशन का उपयोग करेगा।क्या बाहरी फ़ाइल में स्प्रिंग फ्रेमवर्क के लिए क्लास नाम निर्दिष्ट करना संभव है?

मैं एक ही तरीके से एक बीन निर्दिष्ट करने में सक्षम होना चाहता हूं। हम कुछ कक्षाओं के साथ काम कर रहे हैं जो डेवलपर से डेवलपर में बदल सकते हैं और यह बहुत अच्छा होगा अगर हम उन्हें इस जानकारी को एक अलग फ़ाइल में निर्दिष्ट करने की अनुमति दे सकें ताकि उन्हें मुख्य कॉन्फ़िगरेशन फ़ाइल से गड़बड़ न हो।

आप एक विचार देने के लिए, हम

<property name="url"> 
    <value>${db.host}</value> 
</property> 

कहाँ db.host अन्य फ़ाइल में निर्दिष्ट किया जाता है जैसे कुछ है। हम क्या चाहते हैं

<bean name="ourBean" class="${class.weneed}" /> 

उपरोक्त वाक्यविन्यास वास्तव में काम नहीं करता है, लेकिन यह दर्शाता है कि हम क्या करना चाहते हैं।

अग्रिम धन्यवाद!

क्रिस

उत्तर

7

आप इस के लिए एक FactoryBean उपयोग कर सकते हैं।

public class MyFactoryBean extends AbstractFactoryBean { 

    private Class targetClass; 

    public void setTargetClass(Class targetClass) { 
     this.targetClass = targetClass; 
    } 

    @Override 
    protected Object createInstance() throws Exception { 
     return targetClass.newInstance(); 
    } 

    @Override 
    public Class getObjectType() { 
     return targetClass; 
    } 

} 

और फिर:

<bean name="ourBean" class="com.xyz.MyFactoryBean"> 
    <property name="targetClass" value="${class.weneed}"/> 
</bean> 

स्प्रिंग संदर्भ अब एक सेम होगा यह उदाहरण एक FactoryBean जब गुण इंजेक्शन लगाने के जो वसंत की क्षमता एक Class वस्तु के लिए एक classname कास्ट करने के लिए का लाभ लेता है ourBean कहा जाता है जो ${class.weneed}

+1

बहुत बढ़िया, कि वास्तव में क्या "weneed" है;) मैं उस ASAP पर एक नज़र डालूंगा और आपको वापस ले जाऊंगा। धन्यवाद! –

0

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

0

मैंने पाया कि सेम प्रतिबिंब के माध्यम से बनाया उचित वसंत सेम (वसंत संदर्भ में पंजीकृत नहीं है और कोई गुण प्रारंभ), इसलिए यहां मामूली सुधार है नहीं है:

@Override 
protected Object createInstance() throws Exception { 
    AutowireCapableBeabFactory beanFactory = (AutowireCapableBeabFactory) getBeanFactory(); 
    return beanFactory.createBean(this.targetClass); 
} 
संबंधित मुद्दे

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