@ConditionalOnProperty有条件地工作

时间:2015-05-06 01:27:42

标签: spring-boot

我的代码如下:

@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)。但注释是方法还是类型注释?它让我在方法上有了更多的灵活性......

1 个答案:

答案 0 :(得分:14)

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

  

@Conditional注释可以通过以下任何方式使用:

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

parseFooBar上声明条件时,它不起作用,因为它不是@Bean方法。当你在类型上声明它时它会按预期工作,因为它会使组件成为条件,这样当属性不匹配时它就不会在应用程序上下文中注册。