每天一個Spring Boot注解學習——@EnableScheduling


背景
最近開始做個小項目慰丛,用到了Spring Boot擎析,在看前輩書寫的代碼時,發(fā)現其中有許多注解是我之前從來沒接觸過的轧拄。于是決定每天抽點時間揽祥,學習總結一下這些陌生的注解,讓以后的工作更加有效率檩电。


在Spring Boot 的入口類 XXXApplication 中,必然會有@SpringBootApplication拄丰,用來標注項目入口府树,以及完成一些基本的自動自動配置。但是料按,在這次項目中奄侠,XXXApplication 類中除了@SpringBootApplication注解,還用到了另一個注解载矿,也就是下面要學習的@EnableScheduling注解垄潮。
分析
在沒有開始學習該注解相關的源碼之前,可以從其名稱先分析一下作用闷盔。
Enable弯洗,能夠、使...可以逢勾。
Schedule, 任務計劃牡整、日程。ing形式也就是取其動詞形式的語義溺拱。
那么也就是說這個注解是用來使計劃任務功能可以使用的注解果正。
那么,新的問題就來了盟迟,對于沒有接觸過 Spring 中“計劃任務”的我而言,計劃任務又是什么呢潦闲?
下來攒菠,就可以帶著問題去看看這個注解的定義類了。
問題:

  1. 這個注解的功能是不是如分析的一樣歉闰,是啟動某種功能的注解辖众?
  2. 關于 “計劃任務” 的定義是什么?

話不多說和敬,直接上定義類源碼:

/*
 * Copyright 2002-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.scheduling.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.Executor;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

/**
 * Enables Spring's scheduled task execution capability, similar to
 * functionality found in Spring's {@code <task:*>} XML namespace. To be used
 * on @{@link Configuration} classes as follows:
 *
 * <pre class="code">
 * @Configuration
 * @EnableScheduling
 * public class AppConfig {
 *
 *     // various @Bean definitions
 * }</pre>
 *
 * This enables detection of @{@link Scheduled} annotations on any Spring-managed
 * bean in the container. For example, given a class {@code MyTask}
 *
 * <pre class="code">
 * package com.myco.tasks;
 *
 * public class MyTask {
 *
 *     @Scheduled(fixedRate=1000)
 *     public void work() {
 *         // task execution logic
 *     }
 * }</pre>
 *
 * the following configuration would ensure that {@code MyTask.work()} is called
 * once every 1000 ms:
 *
 * <pre class="code">
 * @Configuration
 * @EnableScheduling
 * public class AppConfig {
 *
 *     @Bean
 *     public MyTask task() {
 *         return new MyTask();
 *     }
 * }</pre>
 *
 * Alternatively, if {@code MyTask} were annotated with {@code @Component}, the
 * following configuration would ensure that its {@code @Scheduled} method is
 * invoked at the desired interval:
 *
 * <pre class="code">
 * @Configuration
 * @EnableScheduling
 * @ComponentScan(basePackages="com.myco.tasks")
 * public class AppConfig {
 * }</pre>
 *
 * Methods annotated with {@code @Scheduled} may even be declared directly within
 * {@code @Configuration} classes:
 *
 * <pre class="code">
 * @Configuration
 * @EnableScheduling
 * public class AppConfig {
 *
 *     @Scheduled(fixedRate=1000)
 *     public void work() {
 *         // task execution logic
 *     }
 * }</pre>
 *
 * <p>By default, will be searching for an associated scheduler definition: either
 * a unique {@link org.springframework.scheduling.TaskScheduler} bean in the context,
 * or a {@code TaskScheduler} bean named "taskScheduler" otherwise; the same lookup
 * will also be performed for a {@link java.util.concurrent.ScheduledExecutorService}
 * bean. If neither of the two is resolvable, a local single-threaded default
 * scheduler will be created and used within the registrar.
 *
 * <p>When more control is desired, a {@code @Configuration} class may implement
 * {@link SchedulingConfigurer}. This allows access to the underlying
 * {@link ScheduledTaskRegistrar} instance. For example, the following example
 * demonstrates how to customize the {@link Executor} used to execute scheduled
 * tasks:
 *
 * <pre class="code">
 * @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);
 *     }
 * }</pre>
 *
 * <p>Note in the example above the use of {@code @Bean(destroyMethod="shutdown")}.
 * This ensures that the task executor is properly shut down when the Spring
 * application context itself is closed.
 *
 * <p>Implementing {@code SchedulingConfigurer} also allows for fine-grained
 * control over task registration via the {@code ScheduledTaskRegistrar}.
 * For example, the following configures the execution of a particular bean
 * method per a custom {@code Trigger} implementation:
 *
 * <pre class="code">
 * @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();
 *     }
 * }</pre>
 *
 * <p>For reference, the example above can be compared to the following Spring XML
 * configuration:
 *
 * <pre class="code">
 * {@code
 * <beans>
 *
 *     <task:annotation-driven scheduler="taskScheduler"/>
 *
 *     <task:scheduler id="taskScheduler" pool-size="42"/>
 *
 *     <task:scheduled-tasks scheduler="taskScheduler">
 *         <task:scheduled ref="myTask" method="work" fixed-rate="1000"/>
 *     </task:scheduled-tasks>
 *
 *     <bean id="myTask" class="com.foo.MyTask"/>
 *
 * </beans>
 * }</pre>
 *
 * The examples are equivalent save that in XML a <em>fixed-rate</em> period is used
 * instead of a custom <em>{@code Trigger}</em> implementation; this is because the
 * {@code task:} namespace {@code scheduled} cannot easily expose such support. This is
 * but one demonstration how the code-based approach allows for maximum configurability
 * through direct access to actual componentry.<p>
 *
 * @author Chris Beams
 * @author Juergen Hoeller
 * @since 3.1
 * @see Scheduled
 * @see SchedulingConfiguration
 * @see SchedulingConfigurer
 * @see ScheduledTaskRegistrar
 * @see Trigger
 * @see ScheduledAnnotationBeanPostProcessor
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(SchedulingConfiguration.class)
@Documented
public @interface EnableScheduling {

}

從注釋的第一句話就可以解答第一個問題凹炸,這個注解確實是啟動前面所說的“計劃任務”功能的,類似于用XML配置 Spring 時的 task 標簽的作用昼弟。
可是這個執(zhí)行“計劃任務”的功能又是什么呢啤它?
范例下面有解釋:
當開發(fā)者在AppConfig類中使用了本注解,并在某個Task類中使用了@Schedule注解舱痘,那么被@Schedule注解的標注的方法就可以在指定時間自動執(zhí)行变骡。

那么這個“計劃任務”其實被稱為“定時任務”更為合適。

總結

關于@EnableScheduling芭逝,其實就是用來使@Schedule注解功能可用的注解塌碌。在 Spring Boot 的配置類中,標注上這個注解旬盯,就可以對項目中的方法某些方法使用@Schedule注解台妆,將其變?yōu)槎〞r自動執(zhí)行翎猛。
但只有兩種注解共同使用時,才能達到本注解應有的作用接剩。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末切厘,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子搂漠,更是在濱河造成了極大的恐慌迂卢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桐汤,死亡現場離奇詭異而克,居然都是意外死亡,警方通過查閱死者的電腦和手機怔毛,發(fā)現死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門员萍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拣度,你說我怎么就攤上這事碎绎。” “怎么了抗果?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵筋帖,是天一觀的道長。 經常有香客問我冤馏,道長日麸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任逮光,我火速辦了婚禮代箭,結果婚禮上,老公的妹妹穿的比我還像新娘涕刚。我一直安慰自己嗡综,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布杜漠。 她就那樣靜靜地躺著极景,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碑幅。 梳的紋絲不亂的頭發(fā)上戴陡,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音沟涨,去河邊找鬼恤批。 笑死,一個胖子當著我的面吹牛裹赴,可吹牛的內容都是我干的喜庞。 我是一名探鬼主播诀浪,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼延都!你這毒婦竟也來了雷猪?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤晰房,失蹤者是張志新(化名)和其女友劉穎求摇,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體殊者,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡与境,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了猖吴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摔刁。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡麻献,死狀恐怖蒂阱,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情今瀑,我是刑警寧澤党窜,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布拗引,位于F島的核電站,受9級特大地震影響幌衣,放射性物質發(fā)生泄漏寺擂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一泼掠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垦细,春花似錦择镇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嘱能,卻和暖如春吝梅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惹骂。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工苏携, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人对粪。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓右冻,卻偏偏與公主長得像装蓬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纱扭,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容