@ConditionalOnProperty有条件地工作

Jef*_*ang 9 spring-boot

我有以下代码:

@Scheduled(cron = "${cron.foo.bar}")
@ConditionalOnProperty(name="cron.foo.bar.enabled", relaxedNames = false)
public void parseFooBar() {
... blah blah blah ...
}
Run Code Online (Sandbox Code Playgroud)

在我的属性文件中,我有:

cron.foo.bar=1 * * * * ?
cron.foo.bar.enabled=false
Run Code Online (Sandbox Code Playgroud)

这不起作用,并且parseFooBar在第1秒每分钟执行一次.

但是,如果我添加字段:

@Value("${cron.foo.bar.enabled}")
private String enabledProp;
Run Code Online (Sandbox Code Playgroud)

所以我可以做一个日志并查看它是什么,parseFooBar不会被执行.删除注入的String再次看到parseFooBar执行.我究竟做错了什么?

编辑:这是使用Spring 4.1.5,Spring Boot 1.2.1和JDK 8

编辑2:将注释移动到类型也有效.(无需强制@Value).但注释是方法还是类型注释?它让我在方法上有更多的灵活性......

And*_*son 14

Spring Framework中的条件用于控制组件是否在应用程序上下文中注册.来自javadoc @Conditional:

@Conditional注释可以在以下任一方式使用:

  • 作为直接或间接注释的任何类的类型级注释@Component,包括@Configuration
  • 作为元注释,用于组成自定义构造型注释
  • 作为任何@Bean方法的方法级注释

当声明条件时parseFooBar它没有效果,因为它不是一种@Bean方法.它在您在类型上声明它时可以正常工作,因为它使组件成为条件,以便在属性不匹配时它不会在应用程序上下文中注册.