我有如下代码:
@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)。但是注释既是方法注释又是类型注释?它使我在方法上更具灵活性。
Spring Framework中的条件用于控制组件是否在应用程序上下文中注册。来自的javadoc @Conditional:
@Conditional
该@Conditional注释可以在以下任一方式使用: 作为任何类的直接或间接注释的类型级别注释@Component,包括@Configuration类 作为元注释,目的是组成自定义构造型注释 作为任何@Bean方法的方法级注释
该@Conditional注释可以在以下任一方式使用:
@Component
@Configuration
@Bean
声明条件时parseFooBar,它不是@Bean方法,因此无效。当您在类型上声明它时,它可以按您期望的方式工作,因为它使组件成为有条件的,以便在属性不匹配时不将其注册到应用程序上下文中。
parseFooBar