@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 方法。当您在类型上声明它时,它会像您期望的那样工作,因为它使组件有条件,这样当 属性 不匹配时它不会在应用程序上下文中注册。