亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring SpringMVC在啟動(dòng)完成后執(zhí)行方法源碼解析

 更新時(shí)間:2017年09月23日 10:10:54   作者:醬油王  
這篇文章主要介紹了SpringMVC在啟動(dòng)完成后執(zhí)行方法源碼解析,還是非常不錯(cuò)的,在這里分享給大家,需要的朋友可以參考下。

關(guān)鍵字:spring容器加載完畢做一件事情(利用ContextRefreshedEvent事件)

應(yīng)用場(chǎng)景:很多時(shí)候我們想要在某個(gè)類加載完畢時(shí)干某件事情,但是使用了spring管理對(duì)象,我們這個(gè)類引用了其他類(可能是更復(fù)雜的關(guān)聯(lián)),所以當(dāng)我們?nèi)ナ褂眠@個(gè)類做事情時(shí)發(fā)現(xiàn)包空指針錯(cuò)誤,這是因?yàn)槲覀冞@個(gè)類有可能已經(jīng)初始化完成,但是引用的其他類不一定初始化完成,所以發(fā)生了空指針錯(cuò)誤,解決方案如下:

1、寫一個(gè)類繼承spring的ApplicationListener監(jiān)聽,并監(jiān)控ContextRefreshedEvent事件(容易初始化完成事件)

2、定義簡(jiǎn)單的bean:<bean id="beanDefineConfigue"

class="com.creatar.portal.webservice.BeanDefineConfigue"></bean>或者直接使用@Component("BeanDefineConfigue")注解方式

完整的類如下:

package com.creatar.portal.webservice;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
@Component("BeanDefineConfigue")
public class BeanDefineConfigue implements
ApplicationListener<ContextRefreshedEvent> {//ContextRefreshedEvent為初始化完畢事件,spring還有很多事件可以利用
// @Autowired
// private IRoleDao roleDao;
/**
* 當(dāng)一個(gè)ApplicationContext被初始化或刷新觸發(fā)
*/
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// roleDao.getUserList();//spring容器初始化完畢加載用戶列表到內(nèi)存
System.out.println("spring容易初始化完畢================================================");
}
}

或者使用xml配置方式(非注解),簡(jiǎn)單配置個(gè)bean即可

<bean id="beanDefineConfigue" class="com.creatar.portal.webservice.BeanDefineConfigue"></bean>

其他定義方式,完整的類如下:

package com.creatar.portal.webservice;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
@Component("BeanDefineConfigue2")
public class BeanDefineConfigue2 implements ApplicationListener<ApplicationEvent> {
List<String> list = new ArrayList<String>();
/**
* 當(dāng)一個(gè)ApplicationContext被初始化或刷新觸發(fā)
*/
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
System.out.println("spring容易初始化完畢================================================888");
}
}
}

spring其他事件:

spring中已經(jīng)內(nèi)置的幾種事件:

ContextClosedEvent   、ContextRefreshedEvent  、ContextStartedEvent  、ContextStoppedEvent   、RequestHandleEvent

后續(xù)研究:

applicationontext和使用MVC之后的webApplicationontext會(huì)兩次調(diào)用上面的方法,如何區(qū)分這個(gè)兩種容器呢?

但是這個(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)用邏輯代碼,其他的容器的初始化完成,則不做任何處理,修改后代碼如下:

 @Override 
  public void onApplicationEvent(ContextRefreshedEvent event) { 
  if(event.getApplicationContext().getParent() == null){//root application context 沒有parent,他就是老大. 
    //需要執(zhí)行的邏輯代碼,當(dāng)spring容器初始化完成后就會(huì)執(zhí)行該方法。 
  } 
  } 

后續(xù)發(fā)現(xiàn)加上以上判斷還是能執(zhí)行兩次,不加的話三次,最終研究結(jié)果使用以下判斷更加準(zhǔn)確:event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext")

總結(jié)

以上就是本文關(guān)于SpringMVC在啟動(dòng)完成后執(zhí)行方法源碼解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。有什么問題,可以留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)本站的支持!

相關(guān)文章

  • JGroups實(shí)現(xiàn)聊天小程序

    JGroups實(shí)現(xiàn)聊天小程序

    這篇文章主要為大家詳細(xì)介紹了JGroups實(shí)現(xiàn)聊天小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Mybatis RowBounds 限制查詢條數(shù)的實(shí)現(xiàn)代碼

    Mybatis RowBounds 限制查詢條數(shù)的實(shí)現(xiàn)代碼

    Oracle 數(shù)據(jù)庫(kù)查詢?cè)黾覴owBounds限制查詢條數(shù),默認(rèn)是0到1000條。下面給大家分享Mybatis RowBounds 限制查詢條數(shù)的實(shí)現(xiàn)代碼,需要的朋友參考下吧
    2016-11-11
  • SpringCloud?Bus組件的使用配置詳解

    SpringCloud?Bus組件的使用配置詳解

    bus稱之為springcloud中消息總線,主要用來(lái)在微服務(wù)系統(tǒng)中實(shí)現(xiàn)遠(yuǎn)端配置更新時(shí)通過廣播形式通知所有客戶端刷新配置信息,避免手動(dòng)重啟服務(wù)的工作,這篇文章主要介紹了SpringCloud?Bus組件的使用,需要的朋友可以參考下
    2022-03-03
  • spring cloud Ribbon用法及原理解析

    spring cloud Ribbon用法及原理解析

    這篇文章主要介紹了spring cloud Ribbon用法及原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 設(shè)計(jì)模式之中介者模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    設(shè)計(jì)模式之中介者模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了設(shè)計(jì)模式之中介者模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • SpringMVC異常處理的三種方式小結(jié)

    SpringMVC異常處理的三種方式小結(jié)

    本文主要介紹了SpringMVC異常處理的三種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • 關(guān)于Android觸摸事件分發(fā)的原理詳析

    關(guān)于Android觸摸事件分發(fā)的原理詳析

    觸摸事件分發(fā)機(jī)制一直以來(lái)都是Android中比較重要的一大塊,自定義view,各種復(fù)雜的自定義手勢(shì)交互都與觸摸事件分發(fā)機(jī)制關(guān)系密,下面這篇文章主要給大家介紹了關(guān)于Android觸摸事件分發(fā)原理的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • SpringBoot整合Spring?Boot?Admin實(shí)現(xiàn)服務(wù)監(jiān)控的方法

    SpringBoot整合Spring?Boot?Admin實(shí)現(xiàn)服務(wù)監(jiān)控的方法

    這篇文章主要介紹了SpringBoot整合Spring?Boot?Admin實(shí)現(xiàn)服務(wù)監(jiān)控,內(nèi)容包括Server端服務(wù)開發(fā),Client端服務(wù)開發(fā)其中Spring Boot Admin還可以對(duì)其監(jiān)控的服務(wù)提供告警功能,如服務(wù)宕機(jī)時(shí),可以及時(shí)以郵件方式通知運(yùn)維人員,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • Activiti流程引擎對(duì)象及配置原理解析

    Activiti流程引擎對(duì)象及配置原理解析

    這篇文章主要介紹了Activiti流程引擎對(duì)象及配置原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java?CopyOnWriteArrayList源碼超詳細(xì)分析

    Java?CopyOnWriteArrayList源碼超詳細(xì)分析

    為了將讀取的性能發(fā)揮到極致,jdk中提供了CopyOnWriteArrayList類,下面這篇文章主要給大家介紹了關(guān)于java中CopyOnWriteArrayList源碼解析的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評(píng)論