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

監(jiān)聽(tīng)器獲取Spring配置文件的方法

 更新時(shí)間:2016年06月07日 15:15:49   作者:eson_15  
這篇文章主要為大家詳細(xì)介紹了監(jiān)聽(tīng)器獲取Spring配置文件的方法,很實(shí)用的方法,感興趣的小伙伴們可以參考一下

我們?cè)谧鲰?xiàng)目的時(shí)候,會(huì)用到監(jiān)聽(tīng)器去獲取Spring的配置文件,然后從中拿出我們需要的bean出來(lái),比如做網(wǎng)站首頁(yè),假設(shè)商品的后臺(tái)業(yè)務(wù)邏輯都做好了,我們需要?jiǎng)?chuàng)建一個(gè)監(jiān)聽(tīng)器,在項(xiàng)目啟動(dòng)時(shí)將首頁(yè)的數(shù)據(jù)查詢出來(lái)放到application里,即在監(jiān)聽(tīng)器里調(diào)用后臺(tái)商品業(yè)務(wù)邏輯的方法,也就是說(shuō)我們需要在監(jiān)聽(tīng)器里獲取Spring中配置的相應(yīng)的bean。先把監(jiān)聽(tīng)器創(chuàng)建出來(lái):

1. 創(chuàng)建InitDataListener
創(chuàng)建一個(gè)監(jiān)聽(tīng)器InitDataListener繼承ServletContextListener:

/** 
 * @Description: TODO(用于項(xiàng)目啟動(dòng)的時(shí)候數(shù)據(jù)初始化) 
 * @author eson_15 
 * 
 */ 
//@Component //監(jiān)聽(tīng)器是web層的組件,它是tomcat實(shí)例化的,不是Spring實(shí)例化的。不能放到Spring中 
public class InitDataListener implements ServletContextListener { 
 
 private ProductService productService = null;//productService中定義了跟商品相關(guān)的業(yè)務(wù)邏輯 
 
 @Override 
 public void contextDestroyed(ServletContextEvent event) { 
 
 } 
 
 @Override 
 public void contextInitialized(ServletContextEvent event) { 
 
 } 
 
} 

并在web.xml中配置該監(jiān)聽(tīng)器:

如上,productService中定義了商品的一些業(yè)務(wù)邏輯,并且這個(gè)productService是交給Spring管理的,那么我們?nèi)绾蔚玫竭@個(gè)對(duì)象呢?首先肯定的一點(diǎn)是:我們不能自己new出來(lái),因?yàn)閚ew出來(lái)的話就跟Spring的IoC沒(méi)有關(guān)系了……主要有三種方式可以實(shí)現(xiàn),我們先一個(gè)個(gè)分析,最后比較優(yōu)劣。

2. 直接加載beans.xml文件
這種方式比較簡(jiǎn)單粗暴,不是要加載配置文件么?那好,我加載就是了,如下:

//@Component //監(jiān)聽(tīng)器是web層的組件,它是tomcat實(shí)例化的,不是Spring實(shí)例化的。不能放到Spring中 
public class InitDataListener implements ServletContextListener { 
 
 
 private ProductService productService = null; //productService中定義了跟商品相關(guān)的業(yè)務(wù)邏輯 
 
 @Override 
 public void contextDestroyed(ServletContextEvent event) { 
 
 } 
 
 @Override 
 public void contextInitialized(ServletContextEvent event) { 
 // 獲取業(yè)務(wù)邏輯類productService查詢商品信息 
 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
 productService = (ProductService) context.getBean("productService"); 
 System.out.println(productService); //輸出看看拿到了沒(méi)有 
 
 //下面是具體productService相關(guān)操作…… 
 } 
 
} 

這種方法完全沒(méi)問(wèn)題,思路很清晰,先加載配置文件beans.xml,然后獲取bean,但是啟動(dòng)tomcat后,我們看看控制臺(tái)輸出的信息:

到這里應(yīng)該發(fā)現(xiàn)這種方式的弊端了,加載了兩次配置文件,也就是說(shuō)那些bean被實(shí)例化了兩次,從打印的信息來(lái)看,是拿到我們自己加載配置文件是實(shí)例化的bean。這種方式明顯不可取。

3. 從ServletContext中獲取
從上面的方法中,我們最起碼可以知道,Spring通過(guò)自己的監(jiān)聽(tīng)器已經(jīng)加載過(guò)一次配置文件了,我們沒(méi)必要再加載一次,那么很容易想到,如果知道Spring加載后放到哪里了,那我們就可以從那地方獲取該配置文件,下面我們看下Spring加載配置文件的過(guò)程:

上圖中(省略了無(wú)關(guān)的代碼),ContextLoaderListener就是web.xml中我們配置的Spring監(jiān)聽(tīng)器,它也實(shí)現(xiàn)了ServletContextListener并繼承了ContextLoader。在監(jiān)聽(tīng)器中主要通過(guò)initWebApplicationContext方法來(lái)獲取配置文件,并創(chuàng)建WebApplicationContext對(duì)象,在initWebApplicationContext方法里主要做兩件事:一是拿到Spring的上下文,二是把Spring上下文放到ServletContext中,并且鍵為:WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE。那么如何拿到Spring的上下文呢?是通過(guò)獲取web.xml中配置的Spring的路徑,CONFIG_LOCATION_PARM其實(shí)是個(gè)字符串常量,就是上面web.xml中配置Spring監(jiān)聽(tīng)器下面的:

<context-param> 
 <param-name>contextConfigLocation</param-name> 
 <!--CONFIG_LOCATION_PARM就是contextConfigLocation--> 
 <param-value>classpath:beans.xml</param-value> 
</context-param> 

所以就很明顯了,通過(guò)web.xml中配置的路徑拿到beans.xml,然后加載這個(gè)配置文件,實(shí)例化bean。
現(xiàn)在我們既然知道了Spring在加載配置文件后,把它放在了ServletContext中,那么我們就可以去這里面直接拿!

//@Component //監(jiān)聽(tīng)器是web層的組件,它是tomcat實(shí)例化的,不是Spring實(shí)例化的。不能放到Spring中 
public class InitDataListener implements ServletContextListener { 
 
 
 private ProductService productService = null; 
 
 @Override 
 public void contextDestroyed(ServletContextEvent event) { 
 // TODO Auto-generated method stub 
 
 } 
 
 @Override 
 public void contextInitialized(ServletContextEvent event) { 
 // 獲取業(yè)務(wù)邏輯類查詢商品信息 
 
 // 解決方案二,項(xiàng)目在啟動(dòng)時(shí),把Spring配置文件通過(guò)Spring的監(jiān)聽(tīng)器加載,存儲(chǔ)到ServletContext中,我們只要在ServletContext中獲取即可。 
 ApplicationContext context = (ApplicationContext) event.getServletContext() 
  .getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
 productService = (ProductService) context.getBean("productService"); 
 System.out.println(productService); 
 } 
 
} 

這樣我們就可以拿到produceService的實(shí)例化對(duì)象了,這種方法好是好,就是getAttribute中的參數(shù)太長(zhǎng),也不知道當(dāng)時(shí)程序員的腦門子被夾了還是咋地,估計(jì)是想不到其他更合適的名字了吧~

4. 通過(guò)Spring提供的工具類加載
也許開(kāi)發(fā)Spring的大牛們也意識(shí)到了這個(gè)參數(shù)名字太長(zhǎng)了,于是他們提供了一個(gè)方法類,可以加載配置文件:

public class InitDataListener implements ServletContextListener { 
 
 
 private ProductService productService = null; 
 
 @Override 
 public void contextDestroyed(ServletContextEvent event) { 
 // TODO Auto-generated method stub 
 
 } 
 
 @Override 
 public void contextInitialized(ServletContextEvent event) { 
 // 獲取業(yè)務(wù)邏輯類查詢商品信息 
 
 WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); 
 productService = (ProductService) context.getBean("productService"); 
 System.out.println(productService); 
 } 
 
} 

其實(shí),這里的getWebApplicationContext方法就是把上面的那個(gè)方法封裝了一下而已,我們看看這個(gè)方法的源碼就知道了:

public static WebApplicationContext getWebApplicationContext(ServletContext sc) { 
 return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
 } 

        這樣更加方便程序員調(diào)用,僅此而已……所以一般我們使用第三種方法來(lái)獲取Spring的配置文件,從而獲取相應(yīng)的實(shí)例化bean。

原文鏈接:http://blog.csdn.net/eson_15/article/details/51373937

以上就是iPhone6splus微信閃退的解決方法,希望對(duì)大家有所幫助,也希望大家多多支持腳本之家,關(guān)注腳本之家的更多精彩內(nèi)容。

相關(guān)文章

  • Java泛型常見(jiàn)面試題(面試必問(wèn))

    Java泛型常見(jiàn)面試題(面試必問(wèn))

    泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計(jì)模式中有非常廣泛的應(yīng)用。java泛型知識(shí)點(diǎn)也是Java開(kāi)發(fā)崗位必問(wèn)的一個(gè)話題,今天小編就給大家普及下Java泛型常見(jiàn)面試題,感興趣的朋友一起看看吧
    2021-06-06
  • RxJava中多種場(chǎng)景的實(shí)現(xiàn)總結(jié)

    RxJava中多種場(chǎng)景的實(shí)現(xiàn)總結(jié)

    這篇文章給大家詳細(xì)介紹了RxJava中多種場(chǎng)景的實(shí)現(xiàn),對(duì)大家學(xué)習(xí)使用RxJava具有一定的參考借鑒價(jià)值,有需要的朋友們可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2016-10-10
  • FeignClient如何共享Header及踩坑過(guò)程記錄

    FeignClient如何共享Header及踩坑過(guò)程記錄

    這篇文章主要介紹了FeignClient如何共享Header及踩坑過(guò)程記錄,
    2022-03-03
  • Java?synchornized與ReentrantLock處理并發(fā)出現(xiàn)的錯(cuò)誤

    Java?synchornized與ReentrantLock處理并發(fā)出現(xiàn)的錯(cuò)誤

    synchronized機(jī)制提供了對(duì)每個(gè)對(duì)象相關(guān)的隱式監(jiān)視器鎖,并強(qiáng)制所有鎖的獲取和釋放都必須在同一個(gè)塊結(jié)構(gòu)中。當(dāng)獲取了多個(gè)鎖時(shí),必須以相反的順序釋放。即synchronized對(duì)于鎖的釋放是隱式的
    2023-01-01
  • idea統(tǒng)計(jì)代碼行數(shù)Statistic的步驟詳解

    idea統(tǒng)計(jì)代碼行數(shù)Statistic的步驟詳解

    這篇文章主要介紹了idea統(tǒng)計(jì)代碼行數(shù)Statistic的步驟詳解,本文通過(guò)使用Statistic插件操作的,通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • JAVA提高第九篇 集合體系

    JAVA提高第九篇 集合體系

    這篇文章主要為大家詳細(xì)介紹了JAVA提高第九篇集合體系的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Java基礎(chǔ)之文件概述

    Java基礎(chǔ)之文件概述

    這篇文章主要介紹了Java基礎(chǔ)之文件概述,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05
  • SpringSecurity整合springBoot、redis實(shí)現(xiàn)登錄互踢功能

    SpringSecurity整合springBoot、redis實(shí)現(xiàn)登錄互踢功能

    這篇文章主要介紹了SpringSecurity整合springBoot、redis實(shí)現(xiàn)登錄互踢,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • 在Spring中使用JDBC和JDBC模板的講解

    在Spring中使用JDBC和JDBC模板的講解

    今天小編就為大家分享一篇關(guān)于在Spring中使用JDBC和JDBC模板的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式實(shí)例分析

    Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式實(shí)例分析

    這篇文章主要介紹了Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式,結(jié)合實(shí)例形式分析了動(dòng)態(tài)代理模式的概念、功能、組成、定義與使用方法,需要的朋友可以參考下
    2018-04-04

最新評(píng)論

博客| 明水县| 左贡县| 苍山县| 海兴县| 新乐市| 深泽县| 水富县| 习水县| 富裕县| 玛多县| 凌源市| 班戈县| 彭山县| 三门县| 北宁市| 贵定县| 化州市| 安溪县| 新绛县| 吴忠市| 当涂县| 屯门区| 万源市| 郴州市| 东港市| 洞口县| 昔阳县| 三明市| 舟曲县| 沽源县| 庆元县| 全州县| 康保县| 宿迁市| 宜君县| 龙井市| 罗甸县| 城固县| 长白| 灯塔市|