精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring的Lifecycle和SmartLifecycle,可以沒用過,但不能不知道!

開發(fā) 架構(gòu)
需要基于Spring容器的生命周期來處理一些邏輯時,通常可以實現(xiàn)SmartLifecycle接口來完成。像Spring Cloud,Spring Boot中都有大量的實踐案例。所以,無論實戰(zhàn)或閱讀源碼,不了解Lifecycle相關(guān)接口,都是一種損失。

[[401794]]

本文轉(zhuǎn)載自微信公眾號「程序新視界」,作者二師兄。轉(zhuǎn)載本文請聯(lián)系程序新視界公眾號。

前言

在使用Spring的過程中,我們通常會用@PostConstruct和@PreDestroy在Bean初始化或銷毀時執(zhí)行一些操作,這些操作屬于Bean聲明周期級別的。

那么,就存在一些遺漏的場景,比如我們想在容器本身的生命周期(比如容器啟動、停止)的事件上做一些工作,很典型的就是Spring Boot中啟動內(nèi)嵌的Web容器。該怎么辦?

這就需要用到Spring提供的另外一個接口Lifecycle。這篇文件就介紹一下Lifecycle接口,以及比它更聰明(Smart)的SmartLifecycle。

Lifecycle接口

Lifecycle是一個接口,它的作用是讓開發(fā)者可以在所有的bean都創(chuàng)建完成(getBean)之后執(zhí)行自己的初始化工作,或者在退出時執(zhí)行資源銷毀工作。

Lifecycle定義了三個方法,任何Bean實現(xiàn)了Lifecycle方法,當ApplicationContext收到start、stop和restart等信號時,就會調(diào)用對應(yīng)的方法。因此可以通過實現(xiàn)Lifecycle接口獲得容器生命周期的回調(diào),實現(xiàn)業(yè)務(wù)擴展。

LifeCycle定義如下:

  1. public interface Lifecycle { 
  2.  
  3.     void start(); 
  4.  
  5.     void stop(); 
  6.  
  7.     boolean isRunning(); 

自定義Lifecycle實現(xiàn)類

首先我們來自定義一個類,實現(xiàn)Lifecycle接口,來看看具體的實踐效果:

  1. @Component 
  2. public class MyLifeCycle implements Lifecycle { 
  3.  
  4.     /** 
  5.      * 運行狀態(tài) 
  6.      */ 
  7.     private volatile boolean running = false
  8.  
  9.     /** 
  10.      * 容器啟動后調(diào)用 
  11.      */ 
  12.     @Override 
  13.     public void start() { 
  14.         System.out.println("容器啟動后執(zhí)行MyLifeCycle操作..."); 
  15.         running = true
  16.     } 
  17.  
  18.     /** 
  19.      * 容器停止時調(diào)用 
  20.      */ 
  21.     @Override 
  22.     public void stop() { 
  23.         System.out.println("收到關(guān)閉容器的信號MyLifeCycle操作..."); 
  24.         running = false
  25.     } 
  26.  
  27.     /** 
  28.      * 檢查此組件是否正在運行。 
  29.      * 1. 只有該方法返回false時,start方法才會被執(zhí)行。 
  30.      * 2. 只有該方法返回true時,stop(Runnable callback)或stop()方法才會被執(zhí)行。 
  31.      */ 
  32.     @Override 
  33.     public boolean isRunning() { 
  34.         System.out.println("檢查MyLifeCycle組件的運行狀態(tài):" + running); 
  35.         return running; 
  36.     } 

單純的將上述代碼添加的Spring Boot項目當中,你會發(fā)現(xiàn)啟動時并沒有打印出任何相關(guān)的日志,只有在關(guān)閉應(yīng)用時會打印出:

  1. 檢查MyLifeCycle組件的運行狀態(tài):false 

這是因為,在SpringBoot或Spring應(yīng)用中如果沒有調(diào)用AbstractApplicationContext#start方法,只是實現(xiàn)了Lifecycle接口,是不會執(zhí)行Lifecycle接口中的啟動方法和isRunning方法的。但在應(yīng)用退出時會執(zhí)行Lifecycle#isRunning方法判斷該Lifecycle是否已經(jīng)啟動,如果返回true則調(diào)用Lifecycle#stop()停止方法。

這個實例有一個很明顯的問題,那就是需要使用者顯式的調(diào)用容器的start()和stop()方法,Lifecycle的接口方法才會被執(zhí)行。

而在一般的項目中,我們很少這樣顯式的去調(diào)用,所以就需要一個更“聰明”的類來處理,這就是SmartLifecycle。

SmartLifecycle

SmartLifecycle繼承自Lifecycle,提供了更豐富的功能:第一,start()方法無需容器顯式調(diào)用就可以被執(zhí)行;第二,可以控制多SmartLifecycle實例的執(zhí)行順序。

先來看一下SmartLifecycle接口的源碼:

  1. public interface SmartLifecycle extends Lifecycle, Phased { 
  2.     int DEFAULT_PHASE = 2147483647; 
  3.  
  4.     default boolean isAutoStartup() { 
  5.         return true
  6.     } 
  7.  
  8.     default void stop(Runnable callback) { 
  9.         this.stop(); 
  10.         callback.run(); 
  11.     } 
  12.  
  13.     default int getPhase() { 
  14.         return 2147483647; 
  15.     } 

可以看出該接口除了繼承Lifecycle接口外,還繼承了Phased。其中g(shù)etPhase方法便是來自Phased。也正是基于Phased接口的這個方法來控制SmartLifecycle的執(zhí)行順序的。

來看一下實例代碼:

  1. @Component 
  2. public class MySmartLifecycle implements SmartLifecycle { 
  3.  
  4.     private volatile boolean running = false
  5.  
  6.     /** 
  7.      * 如果該`Lifecycle`類所在的上下文在調(diào)用`refresh`時,希望能夠自己自動進行回調(diào),則返回`true`, 
  8.      * false的值表明組件打算通過顯式的start()調(diào)用來啟動,類似于普通的Lifecycle實現(xiàn)。 
  9.      */ 
  10.     @Override 
  11.     public boolean isAutoStartup() { 
  12.         return true
  13.     } 
  14.  
  15.     /** 
  16.      * SmartLifecycle子類的才有的方法,當isRunning方法返回true時,該方法才會被調(diào)用。 
  17.      * 很多框架中的源碼中,都會把真正邏輯寫在stop()方法內(nèi)。 
  18.      * 比如quartz和Redis的spring支持包。 
  19.      */ 
  20.     @Override 
  21.     public void stop(Runnable callback) { 
  22.         System.out.println("MySmartLifecycle容器停止,執(zhí)行回調(diào)函數(shù)"); 
  23.         stop(); 
  24.         // 如果你讓isRunning返回true,需要執(zhí)行stop這個方法,那么就不要忘記調(diào)用callback.run()。 
  25.         // 否則在程序退出時,Spring的DefaultLifecycleProcessor會認為這個MySmartLifecycle沒有stop完成,程序會一直卡著結(jié)束不了,等待一定時間(默認超時時間30秒)后才會自動結(jié)束。 
  26.         callback.run(); 
  27.     } 
  28.  
  29.     /** 
  30.      * 1. 主要在該方法中啟動任務(wù)或者其他異步服務(wù),比如開啟MQ接收消息<br/> 
  31.      * 2. 當上下文被刷新(所有對象已被實例化和初始化之后)時,將調(diào)用該方法, 
  32.      * 默認生命周期處理器將檢查每個SmartLifecycle對象的isAutoStartup()方法返回的布爾值。 
  33.      * 如果為“true”,則該方法會被調(diào)用,而不是等待顯式調(diào)用自己的start()方法。 
  34.      */ 
  35.     @Override 
  36.     public void start() { 
  37.         System.out.println("MySmartLifecycle容器啟動完成 ..."); 
  38.         running = true
  39.     } 
  40.  
  41.     /** 
  42.      * 接口Lifecycle子類的方法,只有非SmartLifecycle的子類才會執(zhí)行該方法。<br/> 
  43.      * 1. 該方法只對直接實現(xiàn)接口Lifecycle的類才起作用,對實現(xiàn)SmartLifecycle接口的類無效。<br/> 
  44.      * 2. 方法stop()和方法stop(Runnable callback)的區(qū)別只在于,后者是SmartLifecycle子類的專屬。 
  45.      */ 
  46.     @Override 
  47.     public void stop() { 
  48.         System.out.println("MySmartLifecycle容器停止 ..."); 
  49.         running = false
  50.     } 
  51.  
  52.     /** 
  53.      * 1. 只有該方法返回false時,start方法才會被執(zhí)行。<br/> 
  54.      * 2. 只有該方法返回true時,stop(Runnable callback)或stop()方法才會被執(zhí)行。 
  55.      */ 
  56.     @Override 
  57.     public boolean isRunning() { 
  58.         System.out.println("MySmartLifecycle檢查運行狀態(tài) ..."); 
  59.         return running; 
  60.     } 
  61.  
  62.     /** 
  63.      * 如果有多個實現(xiàn)接口SmartLifecycle的類,則這些類的start的執(zhí)行順序按getPhase方法返回值從小到大執(zhí)行。<br/> 
  64.      * 例如:1比2先執(zhí)行,-1比0先執(zhí)行。stop方法的執(zhí)行順序則相反,getPhase返回值較大類的stop方法先被調(diào)用,小的后被調(diào)用。 
  65.      * 
  66.      */ 
  67.     @Override 
  68.     public int getPhase() { 
  69.         return 0; 
  70.     } 

關(guān)于每個方法的功能,注釋部分已經(jīng)明確說明了,下面啟動SpringBoot項目,打印日志如下:

  1. MySmartLifecycle檢查運行狀態(tài) ... 
  2. MySmartLifecycle容器啟動完成 ... 

關(guān)閉SpringBoot項目,打印日志如下:

  1. MySmartLifecycle檢查運行狀態(tài) ... 
  2. MySmartLifecycle容器停止,執(zhí)行回調(diào)函數(shù) 
  3. MySmartLifecycle容器停止 ... 

通過上述實例可以看出:如果一個Bean實現(xiàn)了SmartLifecycle接口,則會執(zhí)行啟動方法。SmartLifecycle#isRunning判斷是否已經(jīng)執(zhí)行,返回false表示還未執(zhí)行,則調(diào)用SmartLifecycle#start()執(zhí)行。

當關(guān)閉時,同樣先檢查運行狀態(tài),如果正在運行,則執(zhí)行關(guān)閉操作。關(guān)閉時,還可以處理對應(yīng)的回調(diào)函數(shù)。

其中,Phased返回值越小,優(yōu)先級越高。

小結(jié)

 

當需要基于Spring容器的生命周期來處理一些邏輯時,通常可以實現(xiàn)SmartLifecycle接口來完成。像Spring Cloud,Spring Boot中都有大量的實踐案例。所以,無論實戰(zhàn)或閱讀源碼,不了解Lifecycle相關(guān)接口,都是一種損失。本文的產(chǎn)生也是在遇到Spring Cloud集成Nacos的源碼中獲得的靈感。

 

責任編輯:武曉燕 來源: 程序新視界
相關(guān)推薦

2017-12-25 13:26:36

CNN深度學習網(wǎng)絡(luò)

2019-07-08 10:40:03

線程池策略CPU

2020-08-18 10:51:18

AIoT數(shù)據(jù)泄露網(wǎng)絡(luò)攻擊

2024-06-03 00:00:05

2016-12-15 17:15:44

2017-01-16 15:01:27

中安威士

2017-01-19 14:44:14

2018-04-16 10:54:00

數(shù)據(jù)中心UPS電池

2009-08-03 09:29:26

2009-06-22 14:17:00

2022-01-05 08:01:48

前端技術(shù)編程

2012-09-17 09:59:46

創(chuàng)業(yè)創(chuàng)業(yè)教訓創(chuàng)業(yè)家

2019-11-13 08:37:34

數(shù)據(jù)庫筒倉基礎(chǔ)架構(gòu)

2010-04-12 16:59:52

Oracle性能診斷

2017-05-04 11:05:43

互聯(lián)網(wǎng)

2010-06-01 09:48:43

云計算CIO整合

2009-12-21 15:43:07

2012-11-23 10:57:44

Shell

2022-02-28 09:44:39

JDKJavaSpring

2017-07-26 10:08:06

FABDesign SuppAndroid
點贊
收藏

51CTO技術(shù)棧公眾號

av手机免费看| 在线免费观看黄色小视频| 国产激情视频在线观看| 国产精品一区二区你懂的| 欧美成人亚洲成人| 超碰男人的天堂| 久久夜夜久久| 午夜精品123| 亚洲不卡1区| 国产黄色一区二区| 日韩成人免费在线| 欧美激情视频在线| 人妻无码一区二区三区免费| 爱高潮www亚洲精品| 91久久精品一区二区| 亚洲精品国产suv一区88| 欧美欧美欧美| 国产91精品久久久久久久网曝门| 国产精品久久久久久久天堂| 久草视频精品在线| 五月婷婷亚洲| 国产一区二区三区视频免费| 你懂的在线观看网站| 亚洲人成777| 色播五月激情综合网| 国产aaa免费视频| 日本精品在线| 久久久精品黄色| 国产一区在线免费观看| 国产精品日韩无码| 免费黄网站欧美| 欧美一区二区三区……| 精品视频久久久久| 婷婷色中文字幕| √天堂8在线网| 亚洲国产激情av| 久久日韩精品| www.黄色片| 国产一区二区三区综合| 国产精品自产拍在线观看| 日韩在线播放中文字幕| 99香蕉国产精品偷在线观看| 欧美疯狂做受xxxx高潮| 黄视频网站免费看| 国产精品久久久久无码av| 这里只有精品丝袜| 阿v天堂2014| 欧美精选一区二区三区| 亚洲天堂网在线观看| 亚洲调教欧美在线| 国产一区二区三区四区五区3d| 色综合久久久久网| 国产麻花豆剧传媒精品mv在线| 男人av在线播放| 精品动漫一区二区三区| 好吊妞无缓冲视频观看| av在线加勒比| 精品久久久精品| 日本三级免费网站| 日韩精品一区在线视频| 99re在线视频| 国产精品久久久久久久久果冻传媒| 日韩电影免费观看在| 日本福利片高清在线观看| 91网上在线视频| 欧美激情一区二区三区在线视频| 极品美乳网红视频免费在线观看| 久久综合九色综合欧美就去吻| 精品无人区一区二区三区竹菊| 五月天婷婷在线观看| 久久综合色天天久久综合图片| 精品免费一区二区三区蜜桃| 日本在线一二三| 国产欧美日韩另类一区| 亚洲欧美日韩综合一区| 欧美jizzhd69巨大| 亚洲精品五月天| 国产精品国产亚洲精品看不卡| 日本在线啊啊| 欧美三级日韩三级国产三级| 8x8x成人免费视频| **爰片久久毛片| 日韩经典第一页| 色屁屁草草影院ccyy.com| 久久久9色精品国产一区二区三区| 久久艳片www.17c.com| 国产污视频在线观看| 香蕉成人久久| 成人深夜直播免费观看| 五月激情六月婷婷| 中文字幕欧美激情| 一本大道东京热无码aⅴ| 天堂av中文在线观看| 欧美制服丝袜第一页| 中文字幕1区2区| 国产一区2区| 欧美日韩成人网| 日韩精品久久久久久免费| 激情欧美一区二区| 久久综合九色综合网站| 美女免费久久| 日韩欧美高清在线视频| 伊人成人222| 欧洲亚洲一区二区三区| 久久久av一区| 久操视频在线免费观看| 高清久久久久久| 亚洲一区二区三区精品视频 | 国产精品12区| 欧美精品七区| 成人三级小说| 欧美久久久久中文字幕| 国产三级国产精品| 欧美三级不卡| 国产日韩在线免费| 九九在线视频| 亚洲福利国产精品| 欧美精品 - 色网| 精品国产欧美日韩| 2020欧美日韩在线视频| 好男人www在线视频| 国产精品大尺度| 成人在线激情网| 加勒比久久高清| 欧美第一淫aaasss性| 91影院在线播放| 国产视频亚洲色图| 国产三区在线视频| 国产成人一二| 欧美黑人国产人伦爽爽爽| 中文字幕乱码无码人妻系列蜜桃| 91亚洲精品久久久蜜桃| 性一交一乱一伧国产女士spa| 亚洲男人在线| 久久精品视频亚洲| 中文字幕av影视| 国产丝袜美腿一区二区三区| 干日本少妇首页| 日本中文字幕在线一区| 午夜精品国产精品大乳美女| 亚洲第一天堂影院| 亚洲精品国产高清久久伦理二区| 小早川怜子一区二区三区| 97精品一区二区| 国产精品视频一| 天天影视久久综合| 91精品国产91热久久久做人人 | 成人精品一区二区三区电影黑人| 国产九九在线| 欧美影院午夜播放| 久久免费手机视频| 美女网站一区二区| 国产精品av免费| 国产一区一区| 欧美激情a在线| 人妻中文字幕一区| 欧美日韩亚洲网| 夜夜春很很躁夜夜躁| 另类小说欧美激情| 久久最新免费视频| 亚洲一区二区三区中文字幕在线观看| 色综合老司机第九色激情| 亚洲免费一级片| 精品久久久久久久久久久| 国产精品一区二区入口九绯色| 噜噜噜91成人网| 神马影院我不卡| 玖玖精品一区| 91精品国产免费久久久久久| 男人久久精品| 欧美精品色综合| 麻豆一区二区三区精品视频| 91视频国产资源| 簧片在线免费看| 欧美国产高潮xxxx1819| 国产欧美日韩综合精品二区| 人人视频精品| 日韩中文字幕欧美| 欧美熟妇另类久久久久久不卡| 欧美日韩国产麻豆| 国产无遮挡在线观看| 国产成人欧美日韩在线电影| 精品99在线视频| 国产精品麻豆久久| 狠狠色综合色区| a屁视频一区二区三区四区| 欧美精品亚州精品| 全色精品综合影院| 91精品国产综合久久精品| 国产午夜精品一区二区理论影院| 久久久www成人免费无遮挡大片| 国产性生活一级片| 蜜桃伊人久久| 日本aa在线观看| 狠狠做六月爱婷婷综合aⅴ | 亚洲婷婷丁香| 91牛牛免费视频| 成人国产二区| 欧美另类在线播放| 欧美美女色图| 精品捆绑美女sm三区| 国产一区二区视频网站| 亚洲最快最全在线视频| 五月婷六月丁香| 97久久精品人人爽人人爽蜜臀 | 日韩激情欧美| 国产精品电影网站| www在线观看黄色| 久久久精品免费视频| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美一级高清片在线观看| 日韩中文字幕高清| 五月天丁香久久| 免费网站看av| |精品福利一区二区三区| 好吊日免费视频| 成人综合在线视频| 亚洲在线观看网站| 强制捆绑调教一区二区| 午夜肉伦伦影院| 国产一级一区二区| www.avtt| 欧美激情综合| 可以免费看的黄色网址| 北条麻妃国产九九九精品小说 | 国产区精品在线观看| 成人av免费电影网站| 久久久久久久久电影| av片在线观看| 久久深夜福利免费观看| 91网在线播放| 尤物99国产成人精品视频| 日本国产在线| 亚洲欧美日韩另类| 你懂的免费在线观看| 日韩不卡在线观看| 日本黄视频在线观看| 亚洲精品在线网站| 天天色棕合合合合合合合| 精品欧美一区二区久久| www.av网站| 日韩欧美中文一区二区| 国产激情无套内精对白视频| 欧美一区二区视频观看视频| 国产女18毛片多18精品| 91麻豆精品国产91久久久| 国产精品高潮呻吟AV无码| 欧美酷刑日本凌虐凌虐| 国产精品羞羞答答在线| 91精品在线观看入口| 国产女无套免费视频| 日韩亚洲欧美在线| 欧美成人免费小视频| 色中色在线视频| 日韩精品中文字幕有码专区 | 东方aⅴ免费观看久久av| 老司机av网站| youjizz国产精品| 久久丫精品国产亚洲av不卡| 99国产精品国产精品久久| 欧美色图亚洲激情| 国产欧美日韩麻豆91| chinese全程对白| 亚洲免费在线视频一区 二区| avove在线播放| 亚洲大片免费看| 国产精品久久久久久久久久精爆| 日本乱人伦一区| 国产精品高潮呻吟久久久| 日韩欧美亚洲国产精品字幕久久久| 亚洲乱码在线观看| 精品视频中文字幕| av在线之家电影网站| 久久国产精品首页| 欧美久久天堂| 成人啪啪免费看| 久久porn| 亚洲国产精品综合| 亚洲一区欧美| www一区二区www免费| 蜜臀精品一区二区三区在线观看| 亚洲精品视频三区| k8久久久一区二区三区| 亚欧精品视频一区二区三区| 亚洲乱码国产乱码精品精可以看| 国产一区在线免费| 日本中文字幕在线2020| 欧美激情第三页| 欧美人与性动交xxⅹxx| 91久久国产精品| 欧美黄色网视频| 中文字幕制服丝袜在线| 亚洲毛片播放| 色播五月激情五月| 99精品久久99久久久久| 激情无码人妻又粗又大| 午夜国产不卡在线观看视频| 一本一道人人妻人人妻αv| 亚洲精品在线免费播放| 18视频免费网址在线观看| 久久久久中文字幕2018| www.久久.com| 精品日产一区2区三区黄免费| 日韩精品午夜| 欧美黄网站在线观看| 国产一区二区视频在线| 亚洲女优在线观看| 五月开心婷婷久久| 国产激情久久久久久熟女老人av| 国产一区二区动漫| heyzo高清国产精品| 国产日韩在线播放| 欧美肉体xxxx裸体137大胆| 国产素人在线观看| 精品夜夜嗨av一区二区三区| 四虎永久免费在线观看| 午夜欧美在线一二页| 国产精选久久久| 最好看的2019年中文视频| 人人视频精品| 欧美激情www| 亚洲理论在线| 国产精品嫩草69影院| 亚洲三级在线免费| 正在播放木下凛凛xv99| 亚洲美女动态图120秒| 男人的天堂免费在线视频| 成人自拍网站| 一区二区三区在线| www.com久久久| 国产精品女上位| 中文字幕欧美人妻精品| 国产亚洲xxx| 天天免费亚洲黑人免费| 欧美激情www| 石原莉奈一区二区三区在线观看| 好吊一区二区三区视频| 黄色一区二区在线| 五月婷婷开心中文字幕| 久久久在线观看| 国产精品久久久久av蜜臀| 可以看毛片的网址| 成人深夜视频在线观看| 国产无遮挡裸体免费视频| 亚洲国产日韩精品在线| a√中文在线观看| 久久精品成人一区二区三区蜜臀| 日韩亚洲国产欧美| 插我舔内射18免费视频| 午夜电影久久久| 午夜av免费观看| 国产www精品| 日韩电影二区| 中文字幕在线视频精品| 亚洲人吸女人奶水| 亚洲av无码一区二区三区dv| 久久久久久伊人| 欧美调教在线| 国产免费999| 最新国产成人在线观看| 国产情侣激情自拍| 久久久久久高潮国产精品视| 色天下一区二区三区| 超碰影院在线观看| 国产精品久久久久四虎| 国产成a人亚洲精v品无码 | 久久久久久久久久网站| 欧美成人综合网站| 小视频免费在线观看| 亚洲成人18| 国产精品自拍一区| 韩国av中文字幕| 色老头一区二区三区| 亚洲性视频在线| 韩国日本在线视频| 亚洲色图在线看| 天天干天天做天天操| 国产精品久久97| 欧美激情自拍| 无码少妇精品一区二区免费动态| 欧美疯狂做受xxxx富婆| 91禁在线看| 亚洲欧洲一二三| 成人黄色一级视频| 中文字幕在线一| 国语自产偷拍精品视频偷 | 久久久精品中文字幕麻豆发布| 一区二区三区免费在线| 久久久久久一区二区三区| 大片网站久久| 少妇熟女视频一区二区三区| 欧美在线制服丝袜| xxxx成人| 在线看成人av电影| 97久久超碰国产精品电影| 97超碰人人草| 日韩av成人在线| 亚洲二区在线| 午夜精品一区二区三级视频| 亚洲欧美成人一区二区在线电影|