web-dev-qa-db-ja.com

条件付き春豆の作成

Springアノテーションの設定について質問があります。私は豆を持っています:

@Bean 
public ObservationWebSocketClient observationWebSocketClient(){
    log.info("creating web socket connection...");
    return new ObservationWebSocketClient();
}

プロパティファイルがあります。

@Autowired
Environment env;

プロパティファイルで、特別なブール値のプロパティを設定したい

createWebsocket=true/false

bean ObservationWebSocketClientを作成する必要があるかどうかを署名します。プロパティ値がfalseの場合、Webソケット接続を確立する必要はありません。

これを実現する技術的な可能性はありますか?

37
user2957954

私はこの機能を使用していませんが、Spring 4でこれを実行できるようです @Conditionalアノテーション

まず、Conditionクラスを作成します。このクラスでは、ConditionContextEnvironmentにアクセスできます。

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実装を多数作成するのではなく、同様の実装を使用することをお勧めします。

51
beerbajay

Beanメソッドに@ConditionalOnProperty("createWebSocket")で注釈を付けます。

Spring Bootには、あらかじめパッケージ化された便利な条件がいくつか用意されています。

39

Spring Boot 2+の場合、次のように使用できます。

@Profile("prod")
or
@Profile({"prod","stg"})

これにより、プロダクションまたはステージング、およびそのアノテーションを使用する基になるBeanの目的のプロファイルをフィルタリングできます。これは、変数spring.profiles.activeが "prod"および( "に等しい場合に、Springbootによってロードされます。 prod」または「stg」)。その変数はO.S.で設定できます。環境変数、または-Dspring.profiles.active = prodなどのコマンドラインを使用します。

0
rod.poli.diniz

私としては、この問題はSpring 3.1を使用して解決できます@Profiles、なぜなら@Conditionalアノテーションは、@Profilesは、Environment変数のみに基づくロジックに基づくことができます。

0