有条件的春豆创作

use*_*954 34 java spring properties

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

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

我有一个属性文件:

@Autowired
Environment env;
Run Code Online (Sandbox Code Playgroud)

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

createWebsocket=true/false
Run Code Online (Sandbox Code Playgroud)

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

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

bee*_*jay 50

虽然我没有使用过这个功能,但是看起来你可以用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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后注释你的bean:

@Bean
@Conditional(MyCondition.class)
public ObservationWebSocketClient observationWebSocketClient(){
    log.info("creating web socket connection...");
    return new ObservationWebSocketClient();
}
Run Code Online (Sandbox Code Playgroud)

编辑spring-boot注释@ConditionalOnProperty已经执行一般本; Condition用于评估它的源代码可以在github上找到感兴趣的人.如果您发现自己经常需要这种功能,那么使用类似的实现是可取的,而不是进行大量的自定义Condition实现.


chr*_*ke- 39

用bean注释你的bean方法@ConditionalOnProperty("createWebSocket").

请注意,Spring Boot提供了许多预先打包的有用条件.

  • 这是'spring-boot`特有的吗? (4认同)
  • 因此,请将工件包含在注释中,并且不要使用自动配置.Boot的优点在于它只是核心条件系统之上的一组规则,可以用于零碎. (2认同)