2012-05-17 12 views
7

मेरा लक्ष्य एक ढांचा है जहां कंक्रीट प्रकार के बीन्स को गुण फ़ाइल द्वारा आसानी से बदला जा सकता है। मैं एक्सएमएल को एनोटेशन भी पसंद करता हूं।एनोटेशन का उपयोग कर वसंत ऑटोवायर और गुण फ़ाइल में परिभाषित एक प्रकार?

@Resource(type="#{myProperties['enabled.subtype']}") 
SomeInterface foo; 

जहां मैं एक PropertiesFactoryBean या <util:properties> शामिल है कि एक फ़ाइल से साथ myProperties लोड किया है::

enabled.type = com.mycompany.SomeClassA; // which implements SomeInterface 

यह नहीं है आदर्श रूप में मैं इस तरह की @Resource और स्पेल एक संयोजन का उपयोग करने के लिए चाहते काम करें क्योंकि type का तर्क एक शाब्दिक होना चाहिए, यानि, कोई स्पेल अनुमत नहीं होना चाहिए। यहाँ सबसे अच्छा अभ्यास क्या है?

अद्यतन: नीचे मेरा उत्तर देखें।

उत्तर

1

यह वसंत जावा कॉन्फ़िगरेशन के लिए बिल्कुल उपयोग का मामला है।

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java

या आप वैकल्पिक रूप से एक फैक्टरी बना सकते हैं।

का उपयोग करना: org.springframework.beans.factory.FactoryBean < SomeInterface>

सेम कि FactoryBean लागू करता है के नाम पर भी अपनी नहीं है, हालांकि एक "SomeInterface" के रूप में देखा जाएगा।

1

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

@Resource(name="beanName") 

और आखिरी यदि आप वसंत का उपयोग करें:

एक दूसरा विकल्प नाम से इंजेक्शन का उपयोग करने से हो सकता है तुम्हारी समस्या।

1

Spring's Java Configuration और Bean Definition Profiles ठीक वही बनें जो मैं ढूंढ रहा था (धन्यवाद @ एडम-जेन और @ गिडो-गार्सिया)। पूर्व गतिशील तत्व के लिए आवश्यक लगता है, और बाद वाला एक बेहतर अभ्यास को बढ़ावा देता है।

यहाँ जावा config और गुणों के साथ एक समाधान है:

@Configuration 
public class SomeClassConfig { 
    @Value("#{myProperties['enabled.subtype']}") 
    public Class enabledClass; 

    @Bean SomeInterface someBean() 
       throws InstantiationException, IllegalAccessException { 
     return (SomeInterface) enabledClass.newInstance(); 
    } 
} 

यहाँ प्रोफाइल के साथ एक से थोड़ा कम गतिशील समाधान है।

@Configuration 
@Profile("dev") 
public class DevelopmentConfig { 
    @Bean SomeInterface someBean() { 
     return new DevSubtype(); 
    } 
} 

@Configuration 
@Profile("prod") 
public class ProductionConfig { 
    @Bean SomeInterface someBean() { 
     return new ProdSubtype(); 
    } 
} 
प्रोफाइल के साथ

, सक्रिय प्रोफ़ाइल (रों) में से एक का उपयोग कर की घोषणा की जाती एक variety of methods ऐसी प्रणाली संपत्ति, JVM संपत्ति, web.xml, आदि उदाहरण के लिए, एक JVM संपत्ति के साथ के माध्यम से के रूप में:

-Dspring.profiles.active="dev" 
+0

यदि आप आलसी हो जाते हैं तो @Bean (autowire = Autowire.BY_TYPE) पर विचार करें। –