Spring @EnableScheduling 注解解析(附带源码)
时间: 2023-08-10 13:31:15 浏览: 227
@EnableScheduling 是 Spring 框架中提供的一个注解,用于开启基于注解的定时任务。其主要作用是扫描带有 @Scheduled 注解的方法,并在指定的时间间隔内执行这些方法。
该注解的源码如下:
```java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(SchedulingConfiguration.class)
public @interface EnableScheduling {
}
```
可以看到,该注解使用了 @Import 注解,导入了 SchedulingConfiguration 类。这个类是 Spring 中的一个配置类,它实现了 SchedulingConfigurer 接口,用于配置任务调度器。
SchedulingConfiguration 类的源码如下:
```java
@Configuration
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class SchedulingConfiguration implements SchedulingConfigurer {
private volatile ScheduledTaskRegistrar taskRegistrar;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
Assert.notNull(taskRegistrar, "ScheduledTaskRegistrar must not be null");
if (this.taskRegistrar != null && taskRegistrar != this.taskRegistrar) {
throw new IllegalStateException("Only one ScheduledTaskRegistrar may exist");
}
this.taskRegistrar = taskRegistrar;
}
@Bean(destroyMethod = "destroy")
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public TaskScheduler taskScheduler() {
return createDefaultTaskScheduler();
}
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public AnnotationAsyncExecutionAspect asyncExecutionAspect() {
return AnnotationAsyncExecutionAspect.aspectOf();
}
private TaskScheduler createDefaultTaskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("spring-task-scheduler-");
return scheduler;
}
}
```
可以看到,该类中定义了一个 taskScheduler() 方法,用于创建默认的任务调度器。同时,它还实现了 SchedulingConfigurer 接口,重写了 configureTasks() 方法,用于配置任务调度器。
总的来说,@EnableScheduling 注解的作用就是开启 Spring 的定时任务功能,通过扫描带有 @Scheduled 注解的方法,自动创建定时任务并执行。同时,它还提供了一些默认的配置,例如默认的任务调度器等。
阅读全文