注解类型:EnableScheduling  @Target(value=TYPE)  @Retention(value=RUNTIME) @Import(value=SchedulingConfiguration.class) @Documented public @interface EnableScheduling 使用该注解让Spring可以进行任务调度,功能类似于Spring的xml命名空间<task:*>  使用 @EnableScheduling 注解的类示例:  @Configuration @EnableScheduling public class AppConfig {     // 各种@bean的定义     // various @Bean definitions } 使用@Scheduled注解可以被Spring容器检测。使用示例:  package com.myco.tasks;  public class MyTask {      @Scheduled(fixedRate=1000)      public void work() {          // 任务执行逻辑          // task execution logic      }  } 下面的配置使MyTask.work()每1000毫秒被执行一次:  @Configuration @EnableScheduling public class AppConfig {     @Bean     public MyTask task() {         return new MyTask();     } } 如果MyTask使用了@Component注解,下面的配置方式也可以让使用了@Scheduled注解的方法在设置的时间间隔里面被调用:  @Configuration @ComponentScan(basePackages="com.myco.tasks") public class AppConfig { } 使用了@Scheduled注解方法也可以在使用了@Configuration注解的类里面使用:  @Configuration @EnableScheduling public class AppConfig {     @Scheduled(fixedRate=1000)     public void work() {         // task execution logic     } } 上面介绍的都是在单线程的情况下执行任务调度的。如果希望进行更多的控制,我们可以让使用@Configuration注解的类实现SchedulingConfigurer接口,这样就可以访问底层的ScheduledRegistrar实例。  下面的例子演示如何定制Executer去执行任务计划:  @Configuration @EnableScheduling public class AppConfig implements SchedulingConfigurer {     @Override     public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {         taskRegistrar.setScheduler(taskExecutor());     }      @Bean(destroyMethod="shutdown")     public Executor taskExecutor() {         return Executors.newScheduledThreadPool(100);     } } 注意上面例子中使用的@bean(destroyMethod="shutdown")。这样是为了确保当Spring应用上下文关闭的时候任务执行者也被正确地关闭。实现SchedulingConfigurar接口还允许细粒度控制任务通过ScheduledTaskRegistrar进行登记。  例如,下面的配置使用自定义的Trigger执行bean的方法   @Configuration  @EnableScheduling  public class AppConfig implements SchedulingConfigurer {      @Override      public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {          taskRegistrar.setScheduler(taskScheduler());          taskRegistrar.addTriggerTask(              new Runnable() {                  public void run() {                      myTask().work();                  }              },              new CustomTrigger()          );      }       @Bean(destroyMethod="shutdown")      public Executor taskScheduler() {          return Executors.newScheduledThreadPool(42);      }       @Bean      public MyTask myTask() {          return new MyTask();      }  } 作为参考,上面的例子和下面使用XML配置方式的作用是一样的:  <beans>     <task:annotation-driven scheduler="taskScheduler"/>     <task:scheduler id="taskScheduler" pool-size="42"/>     <task:scheduled ref="myTask" method="work" fixed-rate="1000"/>     <bean id="myTask" class="com.foo.MyTask"/> </beans>