Java 条件springbean创建

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; 在属性

我有一个关于Spring注释配置的问题。我有一颗豆子:

@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
:因此将工件包含在注释中,不要使用自动配置。引导的妙处在于,它只是核心条件系统之上的一组规则,可以零零碎碎地使用。