2016-08-24 5 views
4

私は、多くの@Component、@Controller、@RestController注釈付きコンポーネントを持つSpring Bootアプリケーションを持っています。私は分離してトグルしたい約20の異なる機能があります。プロジェクトを再構築することなく機能を切り替えることが重要です(再起動は問題ありません)。私は春の設定がいい方法だと思う。私はこのような画像設定(YML)でしFeature-Toggle for Springコンポーネント

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

主な問題は、私はすべての場所であれば、ブロックを使用したくないということです。私はコンポーネントを完全に無効にすることをお勧めします。例えば、@RestControllerはロードされなければならず、そのpathesを登録すべきではありません。現在、次のようなものを探しています:

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

このような機能はありますか?それを自分で実装する簡単な方法はありますか?または、機能トグルの別のベストプラクティスがありますか?ところで

:春ブートバージョン:1.3.4

+0

これは大きな痛みです。私の会社では、ハーフベークされたコードを、それが呼び出されないことを保証できる限り、プロダクションにリリースすることが許されています。だから、春はすべて一緒に配線していますが、それは本当に重要ですか?唯一の他の選択肢は、それが使用される前に技術的な負債を生み出すif/elseです。 –

+0

スプリングプロファイル? http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.htmlクラスには特定のプロファイルのみの注釈を付けることができます。アクティブなプロファイルは、サーバーの起動時に設定できます。 –

+0

春以外のhttp://ff4j.org/ライブラリ。 –

答えて

6

を動作するはずですあなたは@ConditionalOnProperty注釈使用することができます

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

ConditionalOnExpression

を見て試してみて、多分これが

@Component 
@ConditionalOnExpression("${myApplication.controller.feature1:false}") // <- something like this 
public class Feature1{ 
    // ... 
} 
4

Conditioコントローラは通常、注入されないので、あなたは、それをautowireする必要はありませんよりも、条件付きBeanは、コントローラの場合はnullを無効

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

@Autowired(required=false) 
private Feature1 feature1; 

- ナリー豆を可能にしました。条件付きBeanがインジェクトされている場合、有効化されていない場合はNo qualifying bean of type [xxx.Feature1]が返されます。そのため、required=falseを使用してオートワイヤードする必要があります。その後、nullのままになります。

条件が特長1 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; 

条件付き有効&無効な豆 - スプリングコンフィグ

@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; 

春プロファイル

別のオプションは、春のプロファイルを通じて豆を有効にするには、次のようになります。@Profile("feature1")。ただし、有効な機能はすべて1つのプロパティspring.profiles.active=feature1, feature2...にリストされている必要がありますので、これはあなたが望むものではないと思います。

1

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

関連する問題