2017-06-27 7 views

答えて

6

オブジェクトを両方ともBeanとして記述することができます。作成はカスタム条件に依存します。構成は次のようになります。

@Configuration 
public class YourConfiguration { 

    @Bean(name="concreteBean") 
    @Conditional(YourCondition.class) 
    public YourInterface concreteBean(){ 
     return new ConcreteBean(); 
    } 

    @Bean(name="noopBean") 
    @Conditional(YourCondition.class) 
    public YourInterface noopBean(){ 
    return new NoopBean(); 
    } 

} 

@Conditionalアノテーションは、代替コンポーネントスキャンプロセスに依存し@Componentで注釈クラスを使用することができます。

あなたはまた、例えば、状態を説明するクラスを、必要とする:条件を記述するクラスを持つ

public class YourCondition implements Condition { 

    @Override 
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
     return "concret".equals(context.getEnvironment().getProperty("your.property")); 
    } 

} 

は非常に柔軟ですが、あなたは、単にプロパティを確認したい場合は、あなたが使用することができます@Conditionのより特殊化されたバージョンである@ConditionalOnPropertyであり、条件クラスを取り除く。その場合、豆のアノテーションに直接条件を記述します。

@ConditionalOnProperty(name="your.property", havingValue="concret") 

この場合の欠点は、各Beanで同じ条件を繰り返す必要があることです。適切な意味のある名前を付けることができるので、別のクラスの単純な@Conditionalをお勧めします。

1

1つのオプションは次のとおりです。

@Bean 
public MyInterface myBean() { 
    if (somePropertySet) { 
     return new RealBean(); 
    } else { 
     return new NoOpBean(); 
    } 
} 

別のオプションは、春のプロファイルを使用することです。

すでに春のプロファイルに(例えば「生産」、「ステージング」など)を使用している場合、第二のオプションは意味をなすこと
@Bean 
@Profile("noop-profile") 
public MyInterface myBean() { 
    return new NoOpBean(); 
} 

@Bean 
@Profile("real-profile") 
public MyInterface myBean() { 
    return new RealBean(); 
} 

関連する問題