7

私の目標は、具体的な種類のBeanをプロパティファイルで簡単に変更できるフレームワークです。また、XMLよりも注釈が好きです。理想的には@Resource、次のようにとSpELの組み合わせを使用します。

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

ここで、またはを含むファイルから、またはをロードmyPropertiesしました。PropertiesFactoryBean<util:properties>

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

の引数はtypeリテラルである必要があるため、つまりSpELは許可されていないため、これは機能しません。ここでのベストプラクティスは何ですか?

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

4

3 に答える 3

1

これはまさにSpringJava構成のユースケースです。

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

または、代わりにファクトリーを作成することもできます。

使用:org.springframework.beans.factory.FactoryBean <SomeInterface>

FactoryBeanを実装するBeanの名前は、そうではない場合でも「SomeInterface」として表示されます。

于 2012-05-17T21:08:42.207 に答える
1

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

2 番目の代替手段は、名前による注入を使用することです。

@Resource(name="beanName")

最後に、Spring 3.1+ を使用している場合は、プロファイルを使用してみてください。問題が解決する場合は、プロファイルごとに異なる Bean セットを使用できます。

于 2012-05-17T21:05:30.770 に答える
1

Spring の Java 構成およびBean 定義プロファイルは、まさに私が探していたものであることが判明しました (@Adam-Gent および @Guido-Garcia に感謝)。前者は動的要素に必要であると思われ、後者はより良い実践を促進します。

Java構成とプロパティを使用したソリューションは次のとおりです。

@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();
    }   
}

プロファイルでは、アクティブなプロファイルは、システム プロパティ、JVM プロパティ、web.xml などのさまざまな方法のいずれかを使用して宣言されます。たとえば、JVM プロパティでは次のようになります。

-Dspring.profiles.active="dev"
于 2012-05-18T16:51:31.650 に答える