最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • Java面試題沖刺第二十五天--并發(fā)編程3

    Java面試題沖刺第二十五天--并發(fā)編程3

    這篇文章主要為大家分享了最有價(jià)值的三道關(guān)于并發(fā)編程的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java循環(huán)遍歷無規(guī)則json的方式:gson、fastjson、orgjson

    java循環(huán)遍歷無規(guī)則json的方式:gson、fastjson、orgjson

    這篇文章主要介紹了java循環(huán)遍歷無規(guī)則json的方式:gson、fastjson、orgjson,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例

    Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例

    這篇文章主要介紹了Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例,PriorityQueue是一種特殊的隊(duì)列,滿足隊(duì)列的“隊(duì)尾進(jìn)、隊(duì)頭出”條件,但是每次插入或刪除元素后,都對(duì)隊(duì)列進(jìn)行調(diào)整,使得隊(duì)列始終構(gòu)成最小堆(或最大堆),需要的朋友可以參考下
    2023-09-09
  • springboot使用kafka推送數(shù)據(jù)到服務(wù)端的操作方法帶認(rèn)證

    springboot使用kafka推送數(shù)據(jù)到服務(wù)端的操作方法帶認(rèn)證

    在使用Kafka進(jìn)行數(shù)據(jù)推送時(shí),遇到認(rèn)證問題導(dǎo)致連接失敗,本文詳細(xì)介紹了Kafka的認(rèn)證配置過程,包括配置文件的引入和參數(shù)設(shè)置,實(shí)際測(cè)試表明,需要正確配置sasl.jaas.config以及其他認(rèn)證參數(shù),探討了配置文件是否可以同時(shí)存在多個(gè)配置塊的可能性,并提出了實(shí)際操作中的注意事項(xiàng)
    2024-11-11
  • SWT(JFace)體驗(yàn)之ProgressBar

    SWT(JFace)體驗(yàn)之ProgressBar

    SWT(JFace)體驗(yàn)之ProgressBar 實(shí)現(xiàn)代碼。
    2009-06-06
  • Spring boot進(jìn)行參數(shù)校驗(yàn)的方法實(shí)例詳解

    Spring boot進(jìn)行參數(shù)校驗(yàn)的方法實(shí)例詳解

    這篇文章主要介紹了Spring boot進(jìn)行參數(shù)校驗(yàn)的方法實(shí)例詳解,非 常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • java實(shí)現(xiàn)撲克牌牌面小程序

    java實(shí)現(xiàn)撲克牌牌面小程序

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)撲克牌牌面小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Spring boot通過切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過程

    Spring boot通過切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過程

    這篇文章主要介紹了Spring boot通過切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springboot集成tkmapper及基本使用教程

    springboot集成tkmapper及基本使用教程

    tk.mybatis可以節(jié)省程序員的大部分時(shí)間,對(duì)于程序員來說關(guān)于一張表的操作無非就是增刪改查,tk.mybatis提供了一些基本操作的SQL語句,比如說按表的主鍵查詢、刪除等基本操作,我們接下來就來介紹一些springboot集成tkmapper及基本使用
    2022-11-11
  • MyBatis3.X復(fù)雜Sql查詢的語句

    MyBatis3.X復(fù)雜Sql查詢的語句

    這篇文章主要介紹了MyBatis3.X復(fù)雜Sql查詢的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

清镇市| 宜川县| 友谊县| 上饶市| 新沂市| 姚安县| 岱山县| 综艺| 荆州市| 北京市| 铅山县| 琼中| 黑龙江省| 民和| 界首市| 长垣县| 余庆县| 大理市| 灵川县| 丹寨县| 涿鹿县| 玉门市| 金阳县| 赫章县| 宝山区| 本溪市| 拉孜县| 台中市| 海丰县| 洞头县| 双桥区| 常宁市| 北辰区| 邵阳市| 绥江县| 连城县| 卢龙县| 霸州市| 郑州市| 安岳县| 洪洞县|