一尘不染

@ConditionalOnProperty有条件工作

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在第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)。但是注释既是方法注释又是类型注释?它使我在方法上更具灵活性。


阅读 843

收藏
2020-05-30

共1个答案

一尘不染

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

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

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

声明条件时parseFooBar,它不是@Bean方法,因此无效。当您在类型上声明它时,它可以按您期望的方式工作,因为它使组件成为有条件的,以便在属性不匹配时不将其注册到应用程序上下文中。

2020-05-30