有条件的春豆创作
我有一个关于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
的逻辑时仅变量。