1

私は春のブートアプリに取り組んでいます。各環境 (dev、int、qa、prd など) のプロパティ ファイルがあります。Bean に関しては、生産用に別の方法で作成する必要があるものもあります。したがって、次の構成があります。

@Configuration
class MyBeans {
    @Bean(name="someBean")
    @Profile("prd")
    MyBean someBeanProd() {
        ...
    }

    @Bean(name="someBean")
    MyBean someBeanDev() {
        ...
    }
}

MyBean は次のように自動配線されます。

@Component
public class SomeService 
{
    @Autowired
    private MyBean someBean;
}

アプリケーションを次のように起動する場合:

-Dspring.profiles.active=prd

「someBeanProd」メソッドが呼び出され (予想どおり)、関連するプロパティ ファイルが読み込まれています (application-prd.properties)。他のプロファイルでは、「someBeanDev」が呼び出され (予想どおり)、関連するプロパティ ファイルが読み込まれます。

ただし、構成内のメソッドの順序を次のように変更すると、「someBeanDev」メソッドが常に呼び出されますが (アクティブなプロファイルが prd の場合でも)、正しいプロパティ ファイルが使用されています。

@Configuration
class MyBeans {
    @Bean(name="someBean")
    MyBean someBeanDev() {
        ...
    }

    @Bean(name="someBean")
    @Profile("prd")
    MyBean someBeanProd() {
        ...
    }
}

これは正しい/予期される動作ですか? 構成ファイル内のメソッドの順序に関係なく、Spring が正しい Bean を作成することを期待していました。

あるプロファイルの Bean を定義する方法はありますか?他のプロファイルは「デフォルト」プロファイルにフォールバックする必要がありますか?

別の Java 構成クラスで prd Bean を作成しても機能しません。

4

2 に答える 2

0

私もこの動作に気付きました。回避策は、異なるプロファイル Bean を異なる @Profile アノテーション付きクラスに保持することです (少し面倒でしたが、問題なく動作したことを覚えています)。

例えば

プロダクション プロファイルに bean1 と bean2 の 2 つの実装があり、ステージング プロファイルに 2 つの異なる実装があるとします。

2 つの構成クラスを作成したい

@Configuration
@Profile({"production"})
public class ConfigProduction {
  @Bean Bean1 bean1(){ return prod impl;}]
  @Bean Bean2 bean2(){ return prod impl;}
}

@Configuration
@Profile({"staging"})
public class ConfigStaging {
  @Bean Bean1 bean1(){ return staging impl;}]
  @Bean Bean2 bean2(){ return staging impl;}
}

デフォルトの application.properties で、アクティブなプロファイルとして production (または好みのもの) を設定します

spring.profiles.active=production、「フォールバック」のような動作を持つ

試してみる

于 2015-10-23T08:43:23.230 に答える