国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 14:13:40
字體:
來源:轉載
供稿:網友

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

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

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

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

如上,productService中定義了商品的一些業(yè)務邏輯,并且這個productService是交給Spring管理的,那么我們如何得到這個對象呢?首先肯定的一點是:我們不能自己new出來,因為new出來的話就跟Spring的IoC沒有關系了……主要有三種方式可以實現(xiàn),我們先一個個分析,最后比較優(yōu)劣。

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

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

這種方法完全沒問題,思路很清晰,先加載配置文件beans.xml,然后獲取bean,但是啟動tomcat后,我們看看控制臺輸出的信息:

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

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

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

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

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

//@Component //監(jiān)聽器是web層的組件,它是tomcat實例化的,不是Spring實例化的。不能放到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è)務邏輯類查詢商品信息   // 解決方案二,項目在啟動時,把Spring配置文件通過Spring的監(jiān)聽器加載,存儲到ServletContext中,我們只要在ServletContext中獲取即可。  ApplicationContext context = (ApplicationContext) event.getServletContext()   .getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);  productService = (ProductService) context.getBean("productService");  System.out.println(productService);  }  } 

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

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

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è)務邏輯類查詢商品信息   WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());  productService = (ProductService) context.getBean("productService");  System.out.println(productService);  }  } 

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

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

        這樣更加方便程序員調用,僅此而已……所以一般我們使用第三種方法來獲取Spring的配置文件,從而獲取相應的實例化bean。

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

以上就是iPhone6splus微信閃退的解決方法,希望對大家有所幫助,也希望大家多多支持武林網,關注武林網的更多精彩內容。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永川市| 浏阳市| 浙江省| 密山市| 称多县| 本溪市| 安新县| 武冈市| 桦川县| 光山县| 金山区| 任丘市| 襄城县| 济宁市| 保康县| 长沙县| 岚皋县| 铁岭市| 乌拉特后旗| 延寿县| 靖州| 招远市| 香河县| 景德镇市| 巴彦淖尔市| 仙桃市| 崇仁县| 白城市| 赣榆县| 临西县| 浮山县| 奉化市| 霸州市| 彭山县| 平昌县| 建昌县| 西昌市| 合作市| 海兴县| 铁力市| 含山县|