2016-08-24 56 views
4

我有一個帶有大量@Component,@Controller,@RestController批註組件的Spring Boot應用程序。大約有20種不同的功能,我想分開切換。在不重建項目的情況下切換功能很重要(可以重新啓動)。我認爲Spring配置將是一個不錯的方法。Feature-Toggle for Spring組件

我可以像一個配置(陽明)是這樣的:

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

的主要問題是,我不希望在所有地方使用,如果塊。我寧願完全禁用組件。例如,一個@RestController甚至應該被加載,它不應該註冊它的路徑。我目前正在尋找這樣的東西:

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

有沒有這樣的功能?有自己實現它的簡單方法嗎?還是有另一種功能切換的最佳做法?

BTW:春引導版本:1.3.4

+0

這是一個主要的痛苦。在我的公司,只要我們能保證它不會被調用,我們就可以將一半的代碼發佈到生產環境中。所以儘管Spring把所有東西連接在一起,它真的很重要嗎?唯一的其他選擇是在甚至使用之前創造技術債務的if/else。 –

+0

彈簧配置文件? http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html您可以將類註釋爲僅適用於特定配置文件。活動配置文件可以在服務器啓動時設置。 –

+0

非Spring 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應受啓用豆 - 空時禁用

@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

有條件啓用&殘疾人豆

如果特徵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")。但是,所有已啓用的功能都必須在單個屬性spring.profiles.active=feature1, feature2...中列出,所以我相信這不是您想要的。

1

FF4J是實現Feature Toggle模式的框架。它提出了一個spring-boot starter,並允許通過專用Web控制檯在運行時啓用或禁用彈簧組件。通過using AOP,它允許基於特徵狀態動態地注入正確的bean。它不會在spring上下文中添加或刪除bean。