javascript
spring的钩子_高级java开发必须掌握的Spring接口——SmartLifecycle
有些場景我們需要在Spring 所有的bean 完成初始化后緊接著執(zhí)行一些任務(wù)或者啟動(dòng)需要的異步服務(wù)。 常見有幾種解決方案
- j2ee 注解 啟動(dòng)前@PostConstruct 銷毀前@PreDestroy 基于j2ee 規(guī)范
- springboot 的 org.springframework.boot.CommandLineRunner springboot 特性前面我已經(jīng)介紹過了
- spring org.springframework.context.SmartLifecycle
這里介紹一下第三種 SmartLifecycle
SmartLifecycle 不僅僅能在初始化后執(zhí)行一個(gè)邏輯,還能再關(guān)閉前執(zhí)行一個(gè)邏輯,比如你一個(gè)服務(wù)在啟動(dòng)時(shí)向服務(wù)注冊(cè)發(fā)現(xiàn)中心發(fā)一個(gè)信號(hào)告訴它服務(wù)上線了,下線前通知它你下線了。也就是實(shí)現(xiàn)了一個(gè) 從生到死 的輪回。
話不多說先實(shí)現(xiàn)一個(gè)SmartLifeCycle
我們發(fā)現(xiàn)實(shí)現(xiàn)類需要實(shí)現(xiàn)3個(gè)方法,但是這3個(gè)方法并不是SmartLifecycle的方法而是
org.springframework.context.Lifecycle的方法:
- void start() 我們主要在該方法中啟動(dòng)任務(wù)或者其他異步服務(wù),比如開啟MQ接收消息當(dāng)上下文被刷新(所有對(duì)象已被實(shí)例化和初始化之后)時(shí),將調(diào)用該方法,默認(rèn)生命周期 處理器將檢查每個(gè)SmartLifecycle對(duì)象的isAutoStartup()方法返回的布爾值。如果為“true”,則該方法會(huì)被調(diào)用,而不是等待顯式調(diào)用自己的start()方法,同時(shí)當(dāng)上下文被刷新(所有對(duì)象已被實(shí)例化和初始化之后)時(shí),將調(diào)用該方法,默認(rèn)生命周期處理器將檢查每個(gè)SmartLifecycle對(duì)象的isAutoStartup()方法返回的布爾值, 如果為true,則該方法會(huì)被調(diào)用,而不是等待顯式調(diào)用自己的start()方法,boolean isRunning() 的狀態(tài)信號(hào)也決定此方法是否執(zhí)行只有當(dāng)該方法返回false start()方法才會(huì)被執(zhí)行,有興趣可以看LifecycleProcessor相關(guān)實(shí)現(xiàn)
- void stop() 顧名思義 生命周期結(jié)束時(shí)調(diào)用的方法。只有當(dāng) boolean isRunning() 方法返回true 該方法才會(huì)被執(zhí)行,該方法是屬于Lifecyle接口的,被SmartLifeCycle作為了一個(gè)鉤子。 實(shí)際執(zhí)行的是SmartLifeCycle中的這個(gè)方法
- boolean isRunning() 作為 信號(hào)來判定 start 還是stop
我們來啟動(dòng)一下springboot應(yīng)用測試一下,下圖說明 start在應(yīng)用啟動(dòng)前執(zhí)行了
然后我們寫一個(gè)springmvc 接口來關(guān)閉應(yīng)用,下面的關(guān)閉方法寫的比較粗糙,當(dāng)然有更高級(jí)的玩法。
我們調(diào)用 /life/destroy 方法 ,會(huì)出現(xiàn)下面的結(jié)果
這里介紹它的一些使用方法和場景,先學(xué)會(huì)使用,更深層次的留給你自己去挖掘。
我是碼農(nóng)小胖哥,關(guān)注我的頭條或者公眾號(hào),天天有干貨。有問題可以留言或者私信,覺得寫的不錯(cuò)可以點(diǎn)個(gè)贊,轉(zhuǎn)發(fā)一下。
總結(jié)
以上是生活随笔為你收集整理的spring的钩子_高级java开发必须掌握的Spring接口——SmartLifecycle的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地下城与勇士传说装备破甲对安图恩有什么用
- 下一篇: python中面向对象空间时间_pyth