我的代码如下:
@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。
但是,如果我添加字段:
@Value("${cron.foo.bar.enabled}")
private String enabledProp;
这样我就可以做日志并查看它是什么,parseFooBar不会被执行。删除注入的String再次看到parseFooBar执行。我做错了什么?
编辑:这是使用Spring 4.1.5,Spring Boot 1.2.1和JDK 8
编辑2:将注释移动到该类型也有效。 (无需强制@Value)。但注释是方法还是类型注释?它让我在方法上有了更多的灵活性......
答案 0 :(得分:14)
Spring Framework中的条件用于控制组件是否在应用程序上下文中注册。来自@Conditional
的javadoc:
@Conditional
注释可以通过以下任何方式使用:
- 作为直接或间接使用
@Component
注释的任何类的类型级注释,包括@Configuration
类- 作为元注释,用于编写自定义构造型注释
- 作为任何
的方法级注释@Bean
方法
在parseFooBar
上声明条件时,它不起作用,因为它不是@Bean
方法。当你在类型上声明它时它会按预期工作,因为它会使组件成为条件,这样当属性不匹配时它就不会在应用程序上下文中注册。