我一直在考虑在编译时评估注释值的 Java 功能,它似乎确实很难外部化注释值。
但是,我不确定这是否真的不可能,所以我很感激任何建议或明确的答案。
更重要的是,我正在尝试外部化一个注释值,它控制 Spring 中计划的方法调用之间的延迟,例如:
public class SomeClass {
private Properties props;
private static final long delay = 0;
@PostConstruct
public void initializeBean() {
Resource resource = new ClassPathResource("scheduling.properties");
props = PropertiesLoaderUtils.loadProperties(resource);
delay = props.getProperties("delayValue");
}
@Scheduled(fixedDelay = delay)
public void someMethod(){
// perform something
}
}
假设 scheduling.properties
在类路径上并且包含属性键 delayValue
及其相应的 long 值。
现在,这段代码有明显的编译错误,因为我们试图为 final
变量赋值,但这是强制性的,因为我们不能将变量赋给注释值,除非它是 static final
。
有什么办法解决这个问题吗?我一直在考虑 Spring 的自定义注解,但根本问题仍然存在——如何将外化值赋给注解?
欢迎任何想法。
编辑:一个小的更新 - Quartz 集成对于这个例子来说是多余的。我们只需要以亚分钟分辨率定期执行,仅此而已。
原文由 quantum 发布,翻译遵循 CC BY-SA 4.0 许可协议
Spring v3.2.2中的
@Scheduled
注解在原来的3个长参数的基础上增加了String参数来处理这个问题。fixedDelayString
,fixedRateString
和initialDelayString
现在也可用: