Java 条件springbean创建
我有一个关于Spring注释配置的问题。我有一颗豆子:Java 条件springbean创建,java,spring,properties,Java,Spring,Properties,我有一个关于Spring注释配置的问题。我有一颗豆子: @Bean public ObservationWebSocketClient observationWebSocketClient(){ log.info("creating web socket connection..."); return new ObservationWebSocketClient(); } 我有一个属性文件: @Autowired Environment env; 在属性
@Bean
public ObservationWebSocketClient observationWebSocketClient(){
log.info("creating web socket connection...");
return new ObservationWebSocketClient();
}
我有一个属性文件:
@Autowired
Environment env;
在属性文件中,我希望有一个特殊的布尔属性
createWebsocket=true/false
指示是否应创建bean ObservationWebSocketClient。若属性值为false,我根本不想建立web套接字连接
是否有技术上的可能性来实现这一点?虽然我没有使用此功能,但您似乎可以使用spring 4来实现这一点 首先,创建一个
条件
类,其中条件上下文
可以访问环境
:
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();
}
编辑弹簧启动注释@ConditionalOnProperty一般地实现了这一点;
条件的源代码用于为感兴趣的人评估它。如果您发现自己经常需要此功能,建议使用类似的实现,而不是进行大量自定义的条件实现。使用@ConditionalOnProperty(“createWebSocket”)
注释bean方法
请注意,Spring Boot提供了许多预先打包的有用条件 对于我来说,这个问题可以通过使用Spring 3.1@Profiles
来解决,因为@Conditional
注释为您提供了定义一些条件bean注册策略的机会(用于条件检查的用户定义策略),当@Profiles
只能基于环境变量的逻辑时。对于Spring Boot 2+您可以简单地使用:
@Profile("prod")
or
@Profile({"prod","stg"})
这将允许您过滤所需的概要文件/概要文件,用于生产或暂存以及使用该注释的基础Bean。只有当您设置变量spring.profiles.active等于“prod”和(“prod”或“stg”)时,Springboot才会加载它。该变量可以在O.S.环境变量上设置,也可以使用命令行设置,例如-Dspring.profiles.active=prod。对您的问题没有直接的答案,但spring概要文件是否适合您?因此,bean只在需要的概要文件中创建(例如,测试、开发、生产…)@chrylis更好的解决方案是什么?从发布的observationWebSocketClient
方法返回null
(在手机上键入需要一段时间)。请查看以下使用ConditionalOnProperty的建议。这似乎更有效。如果createWebsocket=true/false标志来自数据库,该怎么办?这是spring boot
特定的吗?@beerbajay我不这么认为,如果是,可以在不启用自动配置的情况下包含注释。它本质上与您的建议非常相似,除了generalized和pre-implemented.Hrmm之外,它似乎只是spring boot
:因此将工件包含在注释中,不要使用自动配置。引导的妙处在于,它只是核心条件系统之上的一组规则,可以零零碎碎地使用。