私は 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