7

私の目標は、具体的な種類のBeanをプロパティファイルで簡単に変更できるフレームワークです。 XMLへの注釈も好きです。注釈とプロパティファイルで定義された型を使用したSpring autowire?

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

これにはない:私は含まれたファイルからPropertiesFactoryBeanまたは<util:properties>myPropertiesをロードした

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

:理想的には私はこのような@ResourceとSPELの組み合わせを使用することをいただきたいですtypeの引数はリテラルでなければならない、つまりSpELが許されないためです。ここでベストプラクティスは何ですか?

更新:以下の回答を参照してください。

答えて

1

私が採用する傾向がある解決策は、構成プロパティ(例では、enabled.type)によって異なるオブジェクトを作成するファクトリを使用することです。

第二の代替名前で注入を使用することができます

@Resource(name="beanName") 

そして最後に、あなたが春を使用する場合、3.1以上、あなたは、プロファイルを使用しようとすることができ、そしてそれは解決した場合、異なるプロファイルに異なる豆のセットを持っていますあなたの問題。

1

Spring's Java ConfigurationBean Definition Profilesは、私が探していたものと正確に一致しています(感謝@アダム・ゲントと@グイド・ガルシア)。前者は動的要素に必要と思われ、後者はより良い習慣を促進する。ここでプロファイルを持つわずかに少ないダイナミックなソリューションです

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

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

は、ここでのJavaの設定およびプロパティを持つソリューションです。プロファイルと

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

@Configuration 
@Profile("prod") 
public class ProductionConfig { 
    @Bean SomeInterface someBean() { 
     return new ProdSubtype(); 
    } 
} 

、アクティブなプロファイル(S)はJVMプロパティで、例えば等システムプロパティ、JVMプロパティのweb.xml、介するなどvariety of methodsのいずれかを使用して宣言される:

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

怠け者になったら、@Bean(autowire = Autowire.BY_TYPE)を検討してください。 –

関連する問題