利用SpEL实现。
我实验了两种方式:
1. 使用"#{}"
2. 使用“#{@}”
以下:
首先。属性:
scheduler:
task-rate:
corn: 0/15 * * * * *
fixed-delay: 15000
initial-delay: 30000
对应的properties实体类:
@ConfigurationProperties(prefix = "scheduler.task-rate")
public class SchedulerConfig {
private String corn;
private Integer fixedDelay;
private Integer initialDelay;
public String getCorn() {
return corn;
}
public void setCorn(String corn) {
this.corn = corn;
}
public Integer getFixedDelay() {
return fixedDelay;
}
public void setFixedDelay(Integer fixedDelay) {
this.fixedDelay = fixedDelay;
}
public Integer getInitialDelay() {
return initialDelay;
}
public void setInitialDelay(Integer initialDelay) {
this.initialDelay = initialDelay;
}
}
1. 使用"#{}",即使用bean.attr的方式获取值
首先,创建bean:
@Bean
public SchedulerConfigHolder schedulerConfigPublic(SchedulerConfig schedulerConfig) {
SchedulerConfigHolder schedulerConfigHolder = new SchedulerConfigHolder();
schedulerConfigHolder.setSchedulerConfig(schedulerConfig);
// schedulerConfigHolder.setCorn(schedulerConfig.getCorn());
// schedulerConfigHolder.setInitialDelay(schedulerConfig.getInitialDelay());
// schedulerConfigHolder.setFixedDelay(schedulerConfig.getFixedDelay());
return schedulerConfigHolder;
}
说明:
a. SpEL支持的bean方式需要先给bean注册到bean resolver,实现查找bean,这里直接利用spring的机制,交给spring创建bean后等于直接被管理了。
b. 这里为了顺便证明"#{}"中使用的是bean的名称来获取的bean,所以在@Bean下,使用的method名称为“schedulerConfigPublic"
c. SchedulerConfig 虽然用@ConfigurationProperties注解了,但依然是不能被SpEL使用的。
接下来使用@Sheduled注解:绑定一个Scheduler
@Component
public class TaskRateScheduler {
@Scheduled(fixedDelayString = "#{schedulerConfigPublic.fixedDelay}",initialDelayString = "#{schedulerConfigPublic.initialDelay}")
public void valuateTaskRate() {
//do something...
}
}
注意:使用的bean名称是schedulerConfigPublic
完成
2. 使用“#{@}”,以直接使用bean的方式传递参数值
首先,定义两个bean:
@Bean
public Integer fixedDelay(SchedulerConfig schedulerConfig) {
return schedulerConfig.getFixedDelay();
}
@Bean
public Integer initialDelay(SchedulerConfig schedulerConfig) {
return schedulerConfig.getInitialDelay();
}
接下来使用@Sheduled注解:绑定一个Scheduler
@Component
public class TaskRateScheduler {
@Scheduled(fixedDelayString = "#{@fixedDelay}", initialDelayString = "#{@initialDelay}")
public void valuateTaskRate() {
//do something...
}
}
说明:@符号后面衔接bean的名称