Springアノテーションの設定について質問があります。私は豆を持っています:
@Bean
public ObservationWebSocketClient observationWebSocketClient(){
log.info("creating web socket connection...");
return new ObservationWebSocketClient();
}
プロパティファイルがあります。
@Autowired
Environment env;
プロパティファイルで、特別なブール値のプロパティを設定したい
createWebsocket=true/false
bean ObservationWebSocketClientを作成する必要があるかどうかを署名します。プロパティ値がfalseの場合、Webソケット接続を確立する必要はありません。
これを実現する技術的な可能性はありますか?
私はこの機能を使用していませんが、Spring 4でこれを実行できるようです @Conditional
アノテーション 。
まず、Condition
クラスを作成します。このクラスでは、ConditionContext
がEnvironment
にアクセスできます。
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context,
AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
return null != env
&& "true".equals(env.getProperty("createWebSocket"));
}
}
次に、Beanに注釈を付けます。
@Bean
@Conditional(MyCondition.class)
public ObservationWebSocketClient observationWebSocketClient(){
log.info("creating web socket connection...");
return new ObservationWebSocketClient();
}
editspring-boot
アノテーション@ConditionalOnProperty
はこれを包括的に実装しました。評価に使用したCondition
のソースコード こちらのgithubで入手可能 興味のある方この機能を必要とすることが多い場合は、カスタムのCondition
実装を多数作成するのではなく、同様の実装を使用することをお勧めします。
Beanメソッドに@ConditionalOnProperty("createWebSocket")
で注釈を付けます。
Spring Bootには、あらかじめパッケージ化された便利な条件がいくつか用意されています。
Spring Boot 2+の場合、次のように使用できます。
@Profile("prod")
or
@Profile({"prod","stg"})
これにより、プロダクションまたはステージング、およびそのアノテーションを使用する基になるBeanの目的のプロファイルをフィルタリングできます。これは、変数spring.profiles.activeが "prod"および( "に等しい場合に、Springbootによってロードされます。 prod」または「stg」)。その変数はO.S.で設定できます。環境変数、または-Dspring.profiles.active = prodなどのコマンドラインを使用します。
私としては、この問題はSpring 3.1を使用して解決できます@Profiles
、なぜなら@Conditional
アノテーションは、@Profiles
は、Environment
変数のみに基づくロジックに基づくことができます。