一尘不染

Conditional spring bean creation

spring

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

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

我有一个属性文件:

@Autowired
Environment env;

在属性文件中,我想要一个特殊的boolean property

createWebsocket=true/false

这标志着是否应该创建一个bean ObservationWebSocketClient。如果属性值为false,我根本不想建立Web套接字连接。

有没有实现这一目标的技术可能性?


阅读 303

收藏
2020-04-20

共1个答案

一尘不染

尽管我没有使用过此功能,但似乎可以使用spring 4的@Conditional注解进行操作。

首先,创建一个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也一般实行这一点; 感兴趣的人可以在github上找到用于Condition评估它的源代码。如果你发现自己经常需要这种功能,建议你使用类似的实现,而不要进行大量的自定义实现。Condition

2020-04-20