我对Spring注释配置有疑问。我有一个豆子:
@Bean
public ObservationWebSocketClient observationWebSocketClient(){
log.info("creating web socket connection...");
return new ObservationWebSocketClient();
}
我有一个属性文件:
@Autowired
Environment env;
在属性文件中,我想要一个特殊的布尔属性
createWebsocket=true/false
表示是否应该创建bean ObservationWebSocketClient。如果属性值为false,我根本不想建立Web套接字连接。
是否有任何技术可能性来实现这一目标?
答案 0 :(得分:44)
虽然我没有使用此功能,但您似乎可以使用春季4 @Conditional
annotation执行此操作。
首先,创建一个Condition
类,其中ConditionContext
可以访问Environment
:
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context,
AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
return null != env
&& "true".equals(env.getProperty("createWebSocket"));
}
}
然后注释你的bean:
@Bean
@Conditional(MyCondition.class)
public ObservationWebSocketClient observationWebSocketClient(){
log.info("creating web socket connection...");
return new ObservationWebSocketClient();
}
修改 spring-boot
注释@ConditionalOnProperty
已经实现了这一点; Condition
的源代码,用于评估感兴趣的人is available on github here。如果您发现自己经常需要这种功能,那么建议使用类似的实现,而不是进行大量的自定义Condition
实现。
答案 1 :(得分:37)
使用@ConditionalOnProperty("createWebSocket")
注释您的bean方法。
请注意,Spring Boot提供了许多预先打包的有用条件。
答案 2 :(得分:0)
对于我来说,这个问题可以通过使用Spring 3.1 @Profiles
来解决,因为@Conditional
注释为您提供了为条件bean注册定义一些策略的机会(用户定义的条件检查策略), @Profiles
只能基于Environment
变量的逻辑。
答案 3 :(得分:0)
对于Spring Boot 2+,您可以简单地使用:
@Profile("prod")
or
@Profile({"prod","stg"})
这将允许您过滤所需的概要文件,以进行生产或暂存,并使用该注释对基础Bean进行过滤,仅当您设置变量spring.profiles.active等于“ prod”时,Springboot才会加载该概要文件和(“ prod”或“ stg”)。该变量可以在O.S.环境变量或使用命令行,例如-Dspring.profiles.active = prod。