将外化值注入Spring注释

qua*_*tum 25 java spring annotations spring-scheduled

我一直在考虑在编译时评估注释值的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
    }
}
Run Code Online (Sandbox Code Playgroud)

假设它scheduling.properties在classpath上并包含属性键delayValue及其对应的long值.

现在,这段代码有明显的编译错误,因为我们试图为final变量赋值,但这是强制性的,因为我们不能将变量赋值给注释值,除非它是static final.

有没有办法解决这个问题?我一直在考虑Spring的自定义注释,但根本问题仍然存在 - 如何将外化值分配给注释?

欢迎任何想法.

编辑:一个小的更新 - Quartz集成对于这个例子来说太过分了.我们只需要以亚分钟的分辨率进行定期执行即可.

小智 69

@ScheduledSpring v3.2.2中的注释已将String参数添加到原始的3个long参数中以处理此问题.fixedDelayString,fixedRateString并且initialDelayString现已太:

 @Scheduled(fixedDelayString = "${my.delay.property}")
 public void someMethod(){
        // perform something
 }
Run Code Online (Sandbox Code Playgroud)