私はSpringの新人で、Springの簡単な「プロファイル」処理の利点を享受しようとしています。私は既にこのチュートリアルで作業しました:https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profileですが、今私はその概念を簡単な例に適用したいと思います。 私は2つのプロファイル:dev
とprod
を持っています。私は@Configuration
のプロファイルを設定したプロファイルに応じて異なるBean(それぞれ共通のインターフェースを実装しています)をインスタンス化できる各プロファイルのクラスを想像します。複数のSpring設定ファイル(プロファイルごとに1つ)
私の現在使用されるクラスは、次のようになります。
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ですが、見つかった3:prodBean、devBean、getDevBean
私のアプローチは推奨された構成から遠いですか?私の意見では、それぞれのbeanに対してそれぞれConfiguration
に@Profile
注釈を付けるのは意味があり、後で新しいクラスが追加されたときにいくつかの変種が忘れられる可能性があります。
ありがとうございました。私はちょうど '@ Service'アノテーションを削除しました。今はそれがうまくいくと思います:) ' @ Conditional'アノテーションも見ていきます。 – user3105453