spring
Springでの条件付きBean登録
サーチ…
備考
条件を使用している際の注意点
- 条件クラスはダイレクトクラス(春のビーンではない )と呼ばれるので、
@Value
プロパティのインジェクションを使用することはできません。つまり、他のスプリングビーンを@Value
することはできません 。 - From java docs - 条件は
BeanFactoryPostProcessor
と同じ制限に従い、Beanインスタンスと決して相互作用しないように注意する必要があります 。BeanFactoryPostProcessor
はBean定義と対話して変更することができますが、Beanインスタンスは変更しないことがあります。そうすると、Beanのインスタンス化が早すぎてコンテナに違反し、意図しない副作用を引き起こす可能性があります。
プロパティーまたは値が指定されている場合にのみBeanを登録する
Spring Beanは、特定の値を持つ場合 、 または指定されたプロパティが満たされている場合にのみ登録されるように設定できます。これを行うには、 Condition.matches
を実装してプロパティ/値を確認します。
public class PropertyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("propertyName") != null;
// optionally check the property value
}
}
Javaの設定では、Beanを登録するための条件として上記の実装を使用します。 @Conditionalアノテーションの使用に注意してください。
@Configuration
public class MyAppConfig {
@Bean
@Conditional(PropertyCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
PropertyCondition
では、任意の数の条件を評価できます。ただし、それぞれの条件を緩やかに結合した状態にするために、実装を分離することをお勧めします。例えば:
@Configuration
public class MyAppConfig {
@Bean
@Conditional({PropertyCondition.class, SomeOtherCondition.class})
public MyBean myBean() {
return new MyBean();
}
}
条件注釈
主な@conditional
付き注釈を除いて、異なる場合に使用される同様の注釈のセットがあります。
クラス条件
@ConditionalOnClass
と@ConditionalOnMissingClass
注釈構成は特定のクラスの有無に基づいて含まれることを可能にします。
たとえば、 OObjectDatabaseTx.class
が依存関係に追加され、 OrientWebConfigurer
Beanが存在せず、コンフィギュレーションを作成する場合
@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
return new OrientWebConfigurer();
}
豆の状態
@ConditionalOnBean
と@ConditionalOnMissingBean
注釈はBeanが特定豆の有無に基づいて含まれることを可能にします。 value属性を使用して、タイプ別にBeanを指定したり、名前でBeanを指定する名前を指定することができます。検索属性を使用すると、Beanの検索時に考慮する必要があるApplicationContext
階層を制限できます。
定義済みのBeanがないかどうかをチェックするときは、上記の例を参照してください。
プロパティ条件
@ConditionalOnProperty
アノテーションを使用すると、Spring環境プロパティに基づいてコンフィグレーションを含めることができます。 prefix属性とname属性を使用して、チェックするプロパティを指定します。デフォルトでは、存在し、 false
ないプロパティはすべて一致します。また、使用して、より高度なチェックを作成することができますhavingValue
とmatchIfMissing
属性を。
@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean
public SomeBean someBean(){
}
リソース条件
@ConditionalOnResource
アノテーションを使用すると、特定のリソースが存在する場合にのみ設定を含めることができます。
@ConditionalOnResource(resources = "classpath:init-db.sql")
Webアプリケーションの条件
@ConditionalOnWebApplication
と@ConditionalOnNotWebApplication
注釈は、コンフィギュレーションは、アプリケーションが「Webアプリケーション」であるかどうかに応じて含まれることを可能にします。
@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}
SpEL発現条件
@ConditionalOnExpression
アノテーションを使用すると、SpEL式の結果に基づいて設定を@ConditionalOnExpression
ことができます。
@ConditionalOnExpression("${rest.security.enabled}==false")