6

多くの @Component、@Controller、@RestController アノテーション付きコンポーネントを含む Spring Boot アプリケーションがあります。個別に切り替えたい約 20 の異なる機能があります。プロジェクトを再構築せずに機能を切り替えることができることが重要です (再起動しても問題ありません)。Spring 構成は良い方法だと思います。

次のような構成 (yml) をイメージできます。

myApplication:
  features:
    feature1: true
    feature2: false
    featureX: ...

主な問題は、すべての場所で if ブロックを使用したくないということです。コンポーネントを完全に無効にしたいと思います。たとえば、 @RestController もロードする必要があり、そのパスを登録しないでください。私は現在、次のようなものを探しています:

@Component
@EnabledIf("myApplication.features.feature1")  // <- something like this
public class Feature1{
   // ...
}

このような機能はありますか?自分で実装する簡単な方法はありますか?または、機能の切り替えに関する別のベスト プラクティスはありますか?

ところで:Spring Bootのバージョン:1.3.4

4

4 に答える 4

7

@ConditionalOnPropertyアノテーションを使用できます。

@Component
@ConditionalOnProperty(prefix = "myApplication.features", name = "feature1")
public class Feature1{
   // ...
}
于 2016-08-24T14:35:01.743 に答える
6

条件付きで有効な Bean - 無効な場合は null

@Component
@ConditionalOnProperty(prefix = "myApplication.features", name = "feature1", havingValue="true")
public class Feature1 {
    //...
}

@Autowired(required=false)
private Feature1 feature1;

条件付き Bean がコントローラーの場合、コントローラーは通常インジェクトされないため、自動配線する必要はありません。条件付き Bean が注入されると、No qualifying bean of type [xxx.Feature1]有効になっていないときに が返されるため、 を使用して自動配線する必要がありますrequired=false。それは残りnullます。

条件付きの有効化および無効化された Bean

Feature1 Bean が他のコンポーネントに注入される場合は、それを使用して注入するrequired=falseか、機能が無効になったときに返されるように Bean を定義できます。

@Component
@ConditionalOnProperty(prefix = "myApplication.features", name = "feature1", havingValue="true")
public class EnabledFeature1 implements Feature1{
    //...
}

@Component
@ConditionalOnProperty(prefix = "myApplication.features", name = "feature1", havingValue="false")
public class DisabledFeature1 implements Feature1{
    //...
}

@Autowired
private Feature1 feature1;

条件付きの有効化および無効化された Bean - Spring Config :

@Configuration
public class Feature1Configuration{
    @Bean
    @ConditionalOnProperty(prefix = "myApplication.features", name = "feature1", havingValue="true")
    public Feature1 enabledFeature1(){
        return new EnabledFeature1();
    }

    @Bean
    @ConditionalOnProperty(prefix = "myApplication.features", name = "feature1", havingValue="false")
    public Feature1 disabledFeature1(){
        return new DisabledFeature1();
    }
}

@Autowired
private Feature1 feature1;

スプリングプロファイル

もう 1 つのオプションは、Spring プロファイルを使用して Bean をアクティブにすることです@Profile("feature1")。ただし、有効な機能はすべて単一のプロパティにリストする必要があるspring.profiles.active=feature1, feature2...ため、これはあなたが望むものではないと思います.

于 2016-08-24T17:15:23.203 に答える
1

ConditionalOnExpressionを見てみる

そして多分これはうまくいくはずです

@Component
@ConditionalOnExpression("${myApplication.controller.feature1:false}")  // <- something like this
public class Feature1{
   // ...
}
于 2016-08-24T14:19:12.520 に答える
1

FF4Jは Feature Toggle パターンを実装するためのフレームワークです。これはspring-boot スターターを提案し、専用の Web コンソールを介して実行時に Spring コンポーネントを有効または無効にすることができます。AOP を使用することで、機能の状態に基づいて正しい Bean を動的に注入できます。Spring コンテキストから Bean を追加または削除しません。

于 2016-08-29T15:34:09.020 に答える