弹簧零部件的特征切换



我有一个Spring Boot应用程序,其中有很多@Component、@Controller和@RestController注释的组件。大约有20种不同的功能,我想分别切换。重要的是,可以在不重建项目的情况下切换功能(可以重新启动(。我认为Spring配置将是一个不错的方式。

我可以想象这样的配置(yml(:

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

主要的问题是我不想在所有地方都使用if块。我更愿意完全禁用这些组件。例如,甚至应该加载@RestController,并且它不应该注册其路径。我目前正在搜索这样的东西:

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

有这样的功能吗?有没有一种简单的方法可以自己实现?或者还有其他功能切换的最佳实践吗?

Btw:Spring Boot版本:1.3.4

您可以使用@ConditionalOnProperty注释:

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

条件启用的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配置:

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

弹簧配置文件

另一个选项是通过spring概要文件激活bean:@Profile("feature1")。但是,所有启用的功能都必须列在一个属性spring.profiles.active=feature1, feature2...中,所以我认为这不是您想要的。

尝试查看ConditionalOnExpression

也许这应该工作

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

FF4J是一个实现Feature Toggle模式的框架。它提出了一个弹簧引导启动器,并允许在运行时通过专用的web控制台启用或禁用弹簧组件。通过使用AOP,它允许根据特性状态动态注入正确的bean。它不会在spring上下文中添加或删除bean。

相关内容

  • 没有找到相关文章

最新更新