精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

网站黄在线观看| 特级西西人体高清大胆| 麻豆免费在线| 91视视频在线直接观看在线看网页在线看| 久久久久久久爱| 亚洲 欧美 日韩在线| 成人香蕉视频| 亚洲欧洲99久久| 国产色综合一区二区三区| 国产99久久久| 中文字幕乱码亚洲无线精品一区| 亚洲国产精品热久久| 女人扒开屁股爽桶30分钟| 秋霞午夜理伦电影在线观看| 国产大片一区二区| 青青青国产精品一区二区| 天天操天天摸天天舔| 99re热精品视频| 一本色道久久综合亚洲aⅴ蜜桃| 一区二区三区av| 高潮一区二区三区乱码| 日本va欧美va精品发布| 97不卡在线视频| 中文字幕电影av| 国产一区二区三区天码| 亚洲成avwww人| 自拍偷拍21p| 亚洲天堂电影| 亚洲国产精品久久一线不卡| 在线免费一区| 国产私拍精品| 久久久久久久av麻豆果冻| 成人自拍偷拍| 国产三级三级在线观看| 日韩国产欧美在线播放| 91精品国产乱码久久久久久久久| 亚洲一级生活片| 欧美www视频在线观看| 精品小视频在线| 韩国三级hd两男一女| 精品麻豆剧传媒av国产九九九| 欧美在线|欧美| 97xxxxx| 丁香花高清在线观看完整版| 亚洲色图另类专区| 手机成人av在线| 日本在线观看视频| 国产精品成人网| 亚洲狠狠婷婷综合久久久| 男人的天堂在线| 久久影院午夜片一区| 精品蜜桃传媒| 午夜激情小视频| 99久久精品国产精品久久| dy888夜精品国产专区| 国产成人精品免费看视频| 九一久久久久久| 91精品久久久久久久久青青| 国产女主播喷水视频在线观看| 99亚洲一区二区| 97久久精品人人澡人人爽缅北| 久久精品国产av一区二区三区| 韩国精品一区二区三区| 欧美国产日韩视频| 日韩av电影网| 久久国产66| 国产精品国产亚洲伊人久久| www.久久网| 捆绑调教美女网站视频一区| 成人日韩在线电影| 性生活黄色大片| 成人亚洲精品久久久久软件| 精品蜜桃传媒| 成人在线高清视频| 亚洲视频香蕉人妖| av一区二区三区免费观看| av资源一区| 一本到三区不卡视频| 日本中文字幕高清| 欧美专区一区| 精品亚洲男同gayvideo网站 | 精品一区二区三区蜜桃| 99r国产精品| 91中文字幕在线观看| 亚洲av无码乱码在线观看性色| 成人av网址在线| 日本不卡久久| 2021国产在线| 色综合天天综合给合国产| jizz18女人| 国产精品nxnn| 国产一区二区三区视频在线观看 | 视频一区 中文字幕| 久久久美女艺术照精彩视频福利播放| 无码免费一区二区三区免费播放| 成人免费看片| 欧美视频在线看| 在线免费看污网站| 性欧美lx╳lx╳| 久久视频精品在线| 久草视频一区二区| 国产精品99久久久久久宅男| 欧美精品久久| 影音先锋中文在线视频| 日韩欧美综合在线视频| 4438x全国最大成人| 极品美女一区二区三区| 欧美激情国产高清| 小泽玛利亚一区二区三区视频| 国产成人在线观看免费网站| 午夜精品一区二区在线观看| 川上优av中文字幕一区二区| 日韩一区二区不卡| 丁香激情五月少妇| av不卡免费看| 91精品国产综合久久久久久丝袜| 国产一级在线| 欧美日韩视频免费播放| 亚洲成人福利视频| 99成人在线视频| 国产成人精品免高潮费视频| 空姐吹箫视频大全| 亚洲三级理论片| 冲田杏梨av在线| 亚洲亚洲免费| 91国在线精品国内播放 | www.久久.com| 亚洲精品一区二区在线| 国产精品99精品| 国产乱对白刺激视频不卡| 日韩精品一线二线三线| 中文字幕影音在线| 日韩经典第一页| 亚洲视频免费播放| 成人av在线一区二区三区| 看一级黄色录像| av在线播放一区二区| 中文字幕欧美在线| 天堂网一区二区| 久久精子c满五个校花| 成年人观看网站| 欧美交a欧美精品喷水| 国内精品小视频在线观看| 精品人妻伦一二三区久久| 亚洲欧美偷拍卡通变态| 手机在线国产视频| 51精产品一区一区三区| 成人美女av在线直播| 日本免费在线视频| 在线电影一区二区三区| 91传媒免费观看| 国产综合久久久久久久久久久久| 在线观看一区二区三区三州| 国产精品视频一区二区三区综合| 久久五月天色综合| 99久久一区二区| 亚洲综合色噜噜狠狠| 国产艳妇疯狂做爰视频| 亚洲激情女人| 欧美日韩在线精品| jizzjizz少妇亚洲水多| 色婷婷成人综合| 国产av一区二区三区精品| 亚洲最色的网站| 日本一区二区在线免费观看| 午夜一区不卡| 日韩精品资源| 在线观看欧美| 国内久久久精品| 九九在线视频| 538在线一区二区精品国产| 青青草在线观看视频| 99久久精品国产毛片| 成人3d动漫一区二区三区| 国产精品二区不卡| 粉嫩av一区二区三区免费观看| 国产在线美女| 中日韩美女免费视频网站在线观看| 一二三四区视频| 亚洲一区在线电影| 88久久精品无码一区二区毛片| 日韩精品成人一区二区三区| 青春草在线视频免费观看| 亚洲日本va午夜在线电影| 91a在线视频| 日本中文字幕在线看| 亚洲精品在线三区| 日韩不卡高清视频| 亚洲一区二区精品视频| 日本激情小视频| 国产成人在线视频免费播放| 国产又黄又猛视频| 欧美国产高潮xxxx1819| 欧美资源一区| 91成人在线精品视频| 日本精品久久中文字幕佐佐木| 麻豆av免费在线观看| 亚洲黄色免费三级| 国产人妖一区二区| 一本一道久久a久久精品| 久久久久久久黄色| 欧美国产精品v| 国产51自产区| 激情综合一区二区三区| 干日本少妇首页| 国产一区久久| 中文字幕在线亚洲三区| 九九免费精品视频在线观看| 91精品国产91久久久久青草| 精品国产美女a久久9999| 国产91精品久久久| 色网在线观看| 久久精品这里热有精品| 国产69久久| 精品视频偷偷看在线观看 | 日韩av影院在线观看| 国产露脸国语对白在线| 91电影在线观看| 国产成人在线免费观看视频| 玉足女爽爽91| 小泽玛利亚一区| 欧美国产日韩在线观看| 成人网站免费观看| 成人aa视频在线观看| 女王人厕视频2ⅴk| 激情综合网av| 激情五月婷婷基地| 蜜臀av性久久久久蜜臀aⅴ四虎| 日本不卡在线观看视频| 一区二区三区国产盗摄| 老子影院午夜伦不卡大全| 欧美91大片| 一本二本三本亚洲码| 999国产精品999久久久久久| 日韩免费电影一区二区三区| 国产精品午夜一区二区三区| 久久精品女人的天堂av| 精品综合久久88少妇激情| 高清视频一区二区三区| 国产在线一区不卡| 亚洲影影院av| 免费精品一区| 国产91免费视频| 成人h动漫免费观看网站| 丁香婷婷久久久综合精品国产| 欧美电影院免费观看| 99电影网电视剧在线观看| 青草伊人久久| 国产伦精品一区二区三区四区视频| 日韩激情欧美| 国产精品久久久久免费| 牛牛精品成人免费视频| 久久久一本精品99久久精品66| 欧美人妖在线观看| 欧美午夜免费| 日韩电影在线视频| 欧美日韩视频免费在线观看| 亚洲精品a级片| www.av91| 久久xxxx精品视频| 嫩草影院国产精品| 极品美女销魂一区二区三区免费| 成人在线短视频| 成人一区二区三区| 手机av免费看| 国产精品乱码久久久久久| 亚洲综合视频网站| 亚洲影视在线播放| 欧美啪啪小视频| 欧美亚洲图片小说| jizz中国少妇| 日韩电影中文字幕在线| 国内三级在线观看| 久久精品久久久久| 91吃瓜在线观看| 国产精品大片wwwwww| 国产精品美女久久久久人| 国产精品视频免费观看| 九九亚洲视频| 99re8这里只有精品| 夜夜嗨一区二区| www.com黄色片| 岛国一区二区三区| 亚洲精品国产精品国自产网站| 18成人在线观看| www日韩精品| 欧美一区二区在线看| 亚州av在线播放| 日韩在线观看免费| 激情国产在线| 成人免费激情视频| 夜夜春成人影院| 日本精品福利视频| 肉丝袜脚交视频一区二区| 无套内谢丰满少妇中文字幕| 久久理论电影网| 久久久久久久久久综合| 欧美日韩在线播放三区| 粉嫩小泬无遮挡久久久久久| 日韩在线欧美在线国产在线| 6699嫩草久久久精品影院| 国产日韩亚洲欧美| 免费久久久久久久久| 日韩中文字幕亚洲精品欧美| 免费在线亚洲欧美| 日本wwwxx| 国产精品久久久久久久久久久免费看| 国产精品a成v人在线播放| 555夜色666亚洲国产免| 成人精品一区二区三区免费| 国产综合在线视频| 欧美特黄不卡| 亚洲国产一区二区精品视频| 嫩草成人www欧美| 中文字幕乱码在线人视频| 久久综合资源网| 欧美成人精品激情在线视频| 欧美日韩中文字幕一区| 免费在线黄色影片| 97久久精品视频| 风间由美性色一区二区三区四区| 青春草在线视频免费观看| 欧美bbbbb| av电影网站在线观看| 欧美午夜视频一区二区| 欧美视频久久久| 欧美激情精品久久久久久黑人 | 欧美日韩国产综合草草| 牛牛热在线视频| **欧美日韩vr在线| 精品少妇一区| www.射射射| 不卡电影免费在线播放一区| 九九视频免费在线观看| 51久久夜色精品国产麻豆| 男人在线资源站| 91精品久久久久久久久不口人| 欧美日韩中文字幕一区二区三区| 成人黄色片视频| 久久久亚洲综合| 手机av免费观看| 国产一区二区久久精品| 日韩免费小视频| 四虎永久国产精品| 美女视频黄免费的久久| 极品色av影院| 91精品麻豆日日躁夜夜躁| 97超碰资源站在线观看| 91精品国产99久久久久久红楼| 欧美区亚洲区| 日韩综合第一页| 欧美日韩亚洲高清| 男人的天堂在线| 国产精品视频自拍| 国产精品久久久久久久免费观看| 三年中文在线观看免费大全中国| 亚洲视频在线观看三级| 国产高清免费av| 亚州av一区二区| 国产精品美女久久久久久不卡 | 日韩三级一区二区| 国产亚洲精品美女| 日韩大陆av| 日本一道在线观看| 99riav久久精品riav| 日韩在线播放中文字幕| 在线观看精品自拍私拍| 高清精品久久| 日韩美女爱爱视频| 26uuu精品一区二区在线观看| 国产乱码77777777| 日韩一区av在线| 国产精品videossex| 精品一区二区中文字幕| 亚洲欧洲日产国码二区| www.国产欧美| 青青在线视频一区二区三区| 欧美gay男男猛男无套| 9191在线视频| 色婷婷av一区二区三区之一色屋| 午夜激情在线观看| 国产免费一区二区| 青娱乐精品视频在线| 国产亚洲第一页| 亚洲午夜色婷婷在线| 精品午夜视频| 国产a级片免费观看| 亚洲男人的天堂av| 免费黄色在线视频网站| 91免费视频国产| 久久精品女人天堂| 91嫩草|国产丨精品入口| 精品一区二区三区电影| 精品三级国产| 四虎永久在线精品无码视频| 亚洲女子a中天字幕| 你懂得网站在线| 国产精品毛片va一区二区三区| 日本怡春院一区二区| www.国产成人|