2017-10-16 17 views
3

Springブートには、設定ファイルで提供されているクラス名とコンストラクタのプロパティとの依存関係を挿入する方法がありますか?プロパティに基づくSpring-Inject依存関係

例えば、私は、共通のインタフェースの2つのバージョン、,FileStoreAおよびFileStoreBを持っています。 application.ymlファイルでこれらのうちどれを使用するかを定義できます。

は、私はこのような何かを行うことができます知っている:

@Value("${fileStore.class}") 
private String fileStoreClassName; 

@Bean 
public IFileStore fileStore() { 
    switch(fileStoreClassName) { 
     case "FileStoreA": 
      return new FileStoreA(); 
     case "FileStoreB": 
      return new FileStoreB(); 
    } 
} 

しかしこれは本当にハック感じています。私はまた手動で抽出し、それらに必要なパラメータを供給する必要があります。

私は理想的には、クラス名に基づいて使用するかどうかを判断することができ、特定のパラメータを指定することもできますので、3番目のFileStoreを追加すると、代わりにクラス名に使用する必要があります。

+0

「クラス名に基づいて使用するかどうかを判断できます」と言うと、それは何ですか'?これらのオブジェクトを自動配線していますか? FileStoreをどのように使用していますか? – robjwilkins

+0

うん。基本的に私は '@Autowired IFileStore fileStore'を基本クラスの実装にかかわらず、実際に直接使う必要があります。 'FileStore'の例は基本的な"ファイル "アクセスのための' get() '、' save() '、' has() 'の3つの関数を持っています(ファイルシステム上の実際のファイルではないかもしれません)。 – samanime

答えて

3

を読むことができ、その後、条件設定を作成

@Configuration 
@ConditionalOnProperty(name = "fileStore.class", havingValue="FileStoreA") 
public class FileStoreAConfiguration { 
    @Bean 
    public IFileStore fileStore() { 
     return new FileStoreA(...); 
    } 
} 

@Configuration 
@ConditionalOnProperty(name = "fileStore.class", havingValue="FileStoreB") 
public class FileStoreBConfiguration { 
    @Bean 
    public IFileStore fileStore() { 
     return new FileStoreB(...); 
    } 
} 

注釈が上使用することができるそれは、それよりも実際には簡単です別の設定クラスを使用する代わりに、代わりにメソッドを使用します。

ConditionalOnProperty Javadoc

+0

これは有望そうです。ありがとう。 – samanime

2

同じ@Beanをコンフィグレーションするには、異なる実装を使用するためにSpringプロファイル(@Profile注釈)を使用できます。

たとえば、次のような生産形態にすることができます。

@Configuration 
@Profile("production") 
public class ProductionConfiguration { 

    // ... 

} 

だから、あなたたとえば、あなたが必要とどのように多くのプロファイルを設定することができますが、その後、あなたはいつものいずれかの方法でプロパティを指定することができますたとえば、application.propertiesに含めることができます。

詳細について

あなたが本当に唯一の単一のBeanが必要な場合は、Spring Boot features - Profiles

+0

"application.yml"が "application-prod.yml"にどのように流れ込むのか、このような細かい流れを止める方法はありますか?我々はかなりの環境を持っていますが、2つの異なるプロファイルしかありません。それぞれのプロフィールを持つことは、仕事の束になるでしょう。 – samanime

0

あなたはおそらくXML-based configurationを探していますか?

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <bean id="fileStore" class="com.example.FileStoreA"> 
     <property name="parameter1" value="Hello World!"/> 
    </bean> 
</beans> 
関連する問題