javascript
Spring Boot————Web应用启动时自动执行ApplicationListener用法
原文:《web服務(wù)啟動(dòng)spring自動(dòng)執(zhí)行ApplicationListener的用法》
引言
我們知道,一般來說一個(gè)項(xiàng)目啟動(dòng)時(shí)需要加載或者執(zhí)行一些特殊的任務(wù)來初始化系統(tǒng),通常的做法就是用servlet去初始化,但是servlet在使用Spring bean時(shí)不能直接注入,還需要在web.xml配置,比較麻煩。今天介紹一下使用spring啟動(dòng)初始化的方法。其實(shí)很簡單,只需兩步就可以了。
在開發(fā)時(shí)有時(shí)候需要在整個(gè)應(yīng)用開始運(yùn)行時(shí)執(zhí)行一些特定代碼,比如初始化環(huán)境,準(zhǔn)備測試數(shù)據(jù)、加載一些數(shù)據(jù)到內(nèi)存等等。
在spring中可以通過ApplicationListener來實(shí)現(xiàn)相關(guān)的功能,加載完成后觸發(fā)contextrefreshedevent事件(上下文件刷新事件)
但是這個(gè)時(shí)候,會(huì)存在一個(gè)問題,在web 項(xiàng)目中(spring mvc),系統(tǒng)會(huì)存在兩個(gè)容器,一個(gè)是root application context?,另一個(gè)就是我們自己的?projectName-servlet? context(作為root application context的子容器)。
這種情況下,就會(huì)造成onApplicationEvent方法被執(zhí)行兩次。為了避免上面提到的問題,我們可以只在root application context初始化完成后調(diào)用邏輯代碼,其他的容器的初始化完成,則不做任何處理,修改后代碼。
實(shí)現(xiàn)方式
1、實(shí)現(xiàn)ApplicationListener接口:
public class Init implements ApplicationListener<ContextRefreshedEvent>{@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {//root application context 沒有parentif(event.getApplicationContext().getDisplayName().equals("RootWebApplicationContext")){//TODO 這里寫下將要初始化的內(nèi)容}} }2、將Init類注冊(cè)到Spring 容器中
@Configuration public class ListenerConfig {@Beanpublic Init init() {return new Init();} }或通過注解方式:
@Component public class Init implements ApplicationListener<ContextRefreshedEvent> {// 省略內(nèi)部代碼 }二次調(diào)用問題
上面第一步中的實(shí)現(xiàn)代碼已經(jīng)通過判斷父容器來解決了二次調(diào)用的問題,關(guān)于二次調(diào)用的解釋,可以參考下面這篇文章:
《Spring ApplicationListener使用方法及問題》
總結(jié)
以上是生活随笔為你收集整理的Spring Boot————Web应用启动时自动执行ApplicationListener用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: a标签跳转后返回原页面 layui_la
- 下一篇: Spring Boot————单元测试