有条件地启用 bean - 禁用时为空
@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;
弹簧型材
另一种选择是通过 spring 配置文件激活 bean @Profile("feature1")
:. 但是,所有启用的功能都必须列在一个属性spring.profiles.active=feature1, feature2...
中,所以我相信这不是你想要的。