1

私は Spring 初心者で、Spring の簡単な「プロファイル」処理の利点を活用しようとしています。私はすでにこのチュートリアルに取り組んでいました: https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profileで、その概念を簡単な例に適用したいと思います。と の 2 つのプロファイルがdevありprodます。@Configuration設定されたプロファイルに応じて、異なる Bean をインスタンス化できる (共通のインターフェイスをそれぞれ実装する) 各プロファイルのクラスを想像します。

現在使用しているクラスは次のようになります。

StatusController.java

@RestController
@RequestMapping("/status")
public class StatusController {

    private final EnvironmentAwareBean environmentBean;

    @Autowired
    public StatusController(EnvironmentAwareBean environmentBean) {
        this.environmentBean = environmentBean;
    }

    @RequestMapping(method = RequestMethod.GET)
    Status getStatus() {
        Status status = new Status();
        status.setExtra("environmentBean=" + environmentBean.getString());
        return status;
    }
}

EnvironmentAwareBean.java

public interface EnvironmentAwareBean {
    String getString();
}

EnvironmentAwareBean.java

@Service
public class DevBean implements EnvironmentAwareBean {
    @Override
    public String getString() {
        return "development";
    }
}

EnvironmentAwareBean.java

@Service
public class ProdBean implements EnvironmentAwareBean {
    @Override
    public String getString() {
        return "production";
    }
}

DevConfig.java

@Configuration
@Profile("dev")
public class DevConfig {

    @Bean
    public EnvironmentAwareBean getDevBean() {
        return new DevBean();
    }
}

ProdConfig.java

@Configuration
@Profile("prod")
public class ProdConfig {

    @Bean
    public EnvironmentAwareBean getProdBean() {
        return new ProdBean();
    }

}

この例を実行すると、起動時に次の例外がスローされます (SPRING_PROFILES_DEFAULTが に設定されdevます)。

(...) UnsatisfiedDependencyException: (...) ネストされた例外は org.springframework.beans.factory.NoUniqueBeanDefinitionException: タイプ [EnvironmentAwareBean] の適格な Bean が定義されていません: 単一の一致する Bean が予想されますが、見つかりました 3: prodBean、devBean、getDevBean

私のアプローチは推奨される構成からかけ離れていますか? 私の意見では、すべての Bean ごとに注釈を付けて、後で新しいクラスが追加されたときにいくつかのバリアントを忘れる可能性があるのではなく、それぞれConfigurationに注釈を付ける方が理にかなっています。@Profile

4

1 に答える 1

2

の実装にEnvironmentAwareBeanはすべて の注釈が付けられ@Serviceます。

つまり、それらはすべてコンポーネント スキャンによって検出されるため、複数の一致する Bean が取得されます。で注釈を付ける必要があり@Serviceますか?

それぞれ@Configuration@Profile注釈を付けることは問題ありません。教育演習としてのもう 1 つの方法は、または Config クラスを使用@Profileせずに、独自の の実装で注釈を付けることです。@Bean@Conditional

于 2016-08-04T21:22:04.293 に答える