2016-08-04 9 views
1

私はSpringの新人で、Springの簡単な「プロファイル」処理の利点を享受しようとしています。私は既にこのチュートリアルで作業しました:https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profileですが、今私はその概念を簡単な例に適用したいと思います。 私は2つのプロファイル:devprodを持っています。私は@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_DEFAULTdevに設定されている)起動時にこの例外をスロー:

(...)UnsatisfiedDependencyException:(...)入れ子の例外がorg.springframework.beans.factory.NoUniqueBeanDefinitionExceptionです:いいえ予選豆[EnvironmentAwareBean]タイプが定義されています:予想される単一の一致するBeanですが、見つかった3:prodBean、devBean、getDevBean

私のアプローチは推奨された構成から遠いですか?私の意見では、それぞれのbeanに対してそれぞれConfiguration@Profile注釈を付けるのは意味があり、後で新しいクラスが追加されたときにいくつかの変種が忘れられる可能性があります。

答えて

2

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

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

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

+0

ありがとうございました。私はちょうど '@ Service'アノテーションを削除しました。今はそれがうまくいくと思います:) ' @ Conditional'アノテーションも見ていきます。 – user3105453

関連する問題