java将外部化值注入Spring注释
我一直在考虑在编译时评估注释值的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
及其相应的长值
现在,这段代码有明显的编译错误,因为我们试图给final
变量赋值,但这是必须的,因为我们不能把变量赋值给注释值,除非它是static final
有没有办法绕过这件事?我一直在考虑Spring的定制注释,但根本问题仍然存在——如何将外部化的值分配给注释
任何想法都欢迎
编辑:一个小的更新——对于这个例子来说,Quartz集成有点过头了。我们只需要一个亚分钟分辨率的周期性执行,仅此而已
# 1 楼答案
一些spring注释支持SpEL
首先:
然后,例如:
不过,我不确定
@Scheduled
是否支持SPeL,但总的来说,这是一种方法关于日程安排,请勾选此post of mine和this related question
# 2 楼答案
SpringV3中的
@Scheduled
注释。2.2在原来的3个长参数的基础上增加了字符串参数来处理这个问题fixedDelayString
、fixedRateString
和initialDelayString
现在也可以使用:# 3 楼答案
更好的方法是使用任务名称空间在xml中定义调度
如果出于某种原因希望对注释执行此操作,则需要创建一个注释,该注释具有另一个可选属性,您可以在其中指定属性名称,或者更好地指定属性占位符表达式或Spel表达式
# 4 楼答案
谢谢你们的回答,你们提供了有价值的信息,让我找到了这个解决方案,所以我对两个答案都投了赞成票
我选择了定制bean后处理器和定制
@Scheduled
注释代码很简单(本质上是对现有Spring代码的一个微不足道的修改),我真的很想知道为什么他们一开始就不这么做
BeanPostProcessor
的代码计数实际上翻了一番,因为我选择处理旧注释和新注释如果你对如何改进这段代码有任何建议,我很乐意听听
CustomScheduled类(注释)
CustomScheduledAnnotationBeanPostProcessor类
春天的背景。xml配置文件