@ConditionalOnProperty 有条件地工作
@ConditionalOnProperty conditionally works
我有如下代码:
@Scheduled(cron = "${cron.foo.bar}")
@ConditionalOnProperty(name="cron.foo.bar.enabled", relaxedNames = false)
public void parseFooBar() {
... blah blah blah ...
}
在我的属性文件中,我有:
cron.foo.bar=1 * * * * ?
cron.foo.bar.enabled=false
这不起作用,parseFooBar 在第 1 秒每分钟执行一次。
但是,如果我添加字段:
@Value("${cron.foo.bar.enabled}")
private String enabledProp;
所以我可以做一个日志并查看它是什么,parseFooBar 不会被执行。再次删除注入的 String 会看到 parseFooBar 执行。我做错了什么?
编辑:这是使用 Spring 4.1.5、Spring Boot 1.2.1 和 JDK 8
编辑 2:将注释移至类型也有效。 (无需强制使用@Value)。但是注解既是Method注解又是Type注解?它给了我更多的灵活性来做这个方法...
SpringFramework 中的条件用于控制组件是否在应用程序上下文中注册。来自 @Conditional
的 javadoc:
The @Conditional
annotation may be used in any of the following ways:
- as a type-level annotation on any class directly or indirectly annotated with
@Component
, including @Configuration
classes
- as a meta-annotation, for the purpose of composing custom stereotype annotations
- as a method-level annotation on any
@Bean
method
当在 parseFooBar
上声明条件时,它没有任何效果,因为它不是 @Bean
方法。当您在类型上声明它时,它会像您期望的那样工作,因为它使组件有条件,这样当 属性 不匹配时它不会在应用程序上下文中注册。
我有如下代码:
@Scheduled(cron = "${cron.foo.bar}")
@ConditionalOnProperty(name="cron.foo.bar.enabled", relaxedNames = false)
public void parseFooBar() {
... blah blah blah ...
}
在我的属性文件中,我有:
cron.foo.bar=1 * * * * ?
cron.foo.bar.enabled=false
这不起作用,parseFooBar 在第 1 秒每分钟执行一次。
但是,如果我添加字段:
@Value("${cron.foo.bar.enabled}")
private String enabledProp;
所以我可以做一个日志并查看它是什么,parseFooBar 不会被执行。再次删除注入的 String 会看到 parseFooBar 执行。我做错了什么?
编辑:这是使用 Spring 4.1.5、Spring Boot 1.2.1 和 JDK 8
编辑 2:将注释移至类型也有效。 (无需强制使用@Value)。但是注解既是Method注解又是Type注解?它给了我更多的灵活性来做这个方法...
SpringFramework 中的条件用于控制组件是否在应用程序上下文中注册。来自 @Conditional
的 javadoc:
The
@Conditional
annotation may be used in any of the following ways:
- as a type-level annotation on any class directly or indirectly annotated with
@Component
, including@Configuration
classes- as a meta-annotation, for the purpose of composing custom stereotype annotations
- as a method-level annotation on any
@Bean
method
当在 parseFooBar
上声明条件时,它没有任何效果,因为它不是 @Bean
方法。当您在类型上声明它时,它会像您期望的那样工作,因为它使组件有条件,这样当 属性 不匹配时它不会在应用程序上下文中注册。