有条件的春豆创作

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

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

我有一个属性文件:

 @Autowired Environment env; 

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

 createWebsocket=true/false 

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

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

虽然我没有使用过这个function,但是看起来你可以用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已经实现了这一点; 用于评估它的Condition的源代码可以在github上找到感兴趣的人。 如果您发现自己经常需要这种function,那么使用类似的实现是可取的,而不是进行大量的自定义Condition实现。

使用@ConditionalOnProperty("createWebSocket")注释bean方法。

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

至于我,这个问题可以通过使用Spring 3.1 @Profiles来解决,因为@Conditional批注为你提供了为条件bean注册定义一些策略的机会(用于条件检查的用户定义策略),当@Profiles只能基于Environment的逻辑时仅变量。