有条件的春豆创作

时间:2015-04-24 09:50:55

标签: java spring properties

我对Spring注释配置有疑问。我有一个豆子:

@Bean 
public ObservationWebSocketClient observationWebSocketClient(){
    log.info("creating web socket connection...");
    return new ObservationWebSocketClient();
}

我有一个属性文件:

@Autowired
Environment env;

在属性文件中,我想要一个特殊的布尔属性

createWebsocket=true/false

表示是否应该创建bean ObservationWebSocketClient。如果属性值为false,我根本不想建立Web套接字连接。

是否有任何技术可能性来实现这一目标?

4 个答案:

答案 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。