ContextLoaderListener介紹

在給新同事培訓Spring MVC時,有人問:可以不配置ContextLoaderListener嗎

所謂ContextLoaderListener,就是在web部署描述符即web.xml里面經常配置的一個監聽器,如下

[html]?view plain?copy
  1. <listener>??
  2. ????<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>??
  3. </listener>??

那么配合它一起使用的,經常是context-param,用來指定Spring要加載的配置文件,比如

[html]?view plain?copy
  1. <context-param>??
  2. ????<param-name>contextConfigLocation</param-name>??
  3. ????<param-value>/WEB-INF/teach-servlet.xml</param-value>??
  4. </context-param>??
  5. ??
  6. <!--?Spring?MVC?-->??
  7. <servlet>??
  8. ????<servlet-name>teach</servlet-name>??
  9. ????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>??
  10. ????<load-on-startup>1</load-on-startup>??
  11. </servlet>??
  12. <servlet-mapping>??
  13. ????<servlet-name>teach</servlet-name>??
  14. ????<url-pattern>*.action</url-pattern>??
  15. </servlet-mapping>??

上面兩段就是在使用Spring MVC時,常用的配置,DispatcherServlet作為Spring MVC控制器的核心調度器

至于 teach-servlet.xml 就是配置一些Spring MVC需要使用的視圖解析器等等


那么問題是:listener節點可以不配置嗎?答案是肯定的:可以不做任何配置!

查看了ContextLoaderListener源代碼,發現它繼承自ContextLoader,并且實現ServletContextListener接口

肯定得實現這個接口了,不然怎么作為Servlet的監聽器呢。。。

ContextLoaderListener 源代碼很簡單,核心是實現了 ServletContextListener 的contextInitialized和contextDestroyed方法

我們看下類圖結構,只列出一部分屬性和方法


因為 contextInitialized和contextDestroyed 方法分別調用了 ContextLoader里面的initWebApplicationContext和closeWebApplicationContext方法

所以核心最終還是 ContextLoader 實現了這個監聽器,那這個監聽器實現了什么功能呢,我們發現有兩個重要屬性

contextConfigLocation:即在web.xml里面指定的配置文件所在目錄,如果不指定,Spring 會加載WEB_INF目錄下,符合 *Context.xml 或 spring*.xml 規則的文件

currentContextPerThread:保存了當前WebApplicationContext


其實監聽器的加載過程可以描述為:

先判WebApplicationContext是否已存在,不存在的話則初始化一個XmlWebApplicationContext(WebApplicationContext的子類),并把該實例put到 currentContextPerThread 中。而初始化 XmlWebApplicationContext 時,就跟我們使用 new ClassPathXmlApplicationContext(contextConfigLocation)一樣

將我們配置的各種bean都添加到XmlWebApplicationContext中,所以我們知道?ApplicationContext 提供各種 getBean的方法。。。

并且可以發現 ContextLoader還提供了獲取當前 WebApplicationContext的靜態方法:之所以能獲取,是因為initWebApplicationContext初始化方法把創建的XmlWebApplicationContext 塞到了 currentContextPerThread 中


說了一堆,跟Spring MVC 不配置ContextLoaderListener有什么關系呢。。。

因為 ContextLoaderListener 本質上是創建了一個 WebApplicationContext ,所以你的項目里面,如果不使用 WebApplicationContext 就可以不配置該節點。

那么只要做這種配置也是可以的:

[html]?view plain?copy
  1. <!--?Spring?MVC?-->??
  2. ????<servlet>??
  3. ????????<servlet-name>teach</servlet-name>??
  4. ????????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>??
  5. ????????<init-param>??
  6. ????????????<param-name>contextConfigLocation</param-name>??
  7. ????????????<param-value>/WEB-INF/teach-servlet.xml</param-value>??
  8. ????????</init-param>??
  9. ????????<load-on-startup>1</load-on-startup>??
  10. ????</servlet>??
  11. ????<servlet-mapping>??
  12. ????????<servlet-name>teach</servlet-name>??
  13. ????????<url-pattern>*.action</url-pattern>??
  14. ????</servlet-mapping>??

發現Spring MVC 所需的配置文件不使用context-param節點指定,直接在DispatcherServlet里面配置即可

注意:這種情況下,你的應用程序是無法使用WebApplicationContext的


正常情況下,都會配置ContextLoaderListener,因為我們知道Spring IOC的兩種實現

基礎的就是BeanFactory,高級的就是ApplicationContext,除非在資源非常有限的情況下,才使用BeanFactory

否則都使用ApplicationContext,而WebApplicationContext就是其中的一種高級實現,它能提供很多有用的方法


那么在應用程序如何獲取 WebApplicationContext 呢,有多種方式,最簡單的就是

[java]?view plain?copy
  1. WebApplicationContext?wac?=?ContextLoader.getCurrentWebApplicationContext();??

這個很熟悉了吧,剛才提到了,當前應用的WebApplicationContext就保存在 ContextLoader的currentContextPerThread屬性當中


還有基于ServletContext上下文獲取的方式

[java]?view plain?copy
  1. ServletContext?sc?=?request.getSession().getServletContext();??
  2. ApplicationContext?ac1?=?WebApplicationContextUtils.getRequiredWebApplicationContext(sc);??
  3. ApplicationContext?ac2?=?WebApplicationContextUtils.getWebApplicationContext(sc);??
  4. WebApplicationContext?wac1?=?(WebApplicationContext)?sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);??


還有一些更合適的,基于Spring提供的抽象類或者接口,在初始化Bean時注入ApplicationContext

繼承自抽象類ApplicationObjectSupport
說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到ApplicationContext。
Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。

繼承自抽象類WebApplicationObjectSupport
說明:類似上面方法,調用getWebApplicationContext()獲取WebApplicationContext

實現接口ApplicationContextAware
說明:實現該接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 對象。
Spring初始化時,會通過該方法將ApplicationContext對象注入。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451418.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451418.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PLSQL安裝教程,無需oracle客戶端(解決本地需要安裝oracle客戶端的煩惱)

最近用筆記本開發&#xff0c;項目用的是Oracle數據庫&#xff0c;不想本地安裝Oracle客戶端。 就只裝了一個PLSQL 連接數據庫的時候各種錯誤&#xff0c;現在解決了記錄一下。 詳細內容見 附件 1、運行 plsqldev1105_x64.exe2、運行 Language_zh_x86_x64.exe3、啟動 plsql 點…

移動開發(C#、VB.NET)Smobiler開發平臺——GifView控件的使用方式

2019獨角獸企業重金招聘Python工程師標準>>> 一、 樣式一 我們要實現上圖中的效果&#xff0c;需要如下的操作&#xff1a; 從工具欄上的“Smobiler Components”拖動一個GifView控件到窗體界面上修改GifView的屬性 AutoPlay屬性獲得和設置是否自動播放Gif…

Spring中的計時器StopWatch

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 需要記錄每個任務執行時間&#xff0c;或者記錄一段代碼執行時間&#xff0c;簡單方法是打印當前時間與執行完時間的差值&#xff0c;若…

常用數據結構--線性結構

數據結構是計算機存儲、組織數據的方式。常見的數據結構分類方式如下圖&#xff1a; 常用的線性結構有&#xff1a;線性表&#xff0c;棧&#xff0c;隊列&#xff0c;循環隊列&#xff0c;數組。線性表中包括順序表、鏈表等&#xff0c;其中&#xff0c;棧和隊列只是屬于邏輯上…

依賴注入簡介(一)

依賴注入(Injecting dependencies)經常聽起來會讓人感覺到很難以理解&#xff0c;會讓大家感覺這是很復雜的編程技術&#xff0c;但是事實上并不是這樣&#xff0c;依賴注入非常方便使用&#xff0c;它會讓你的程序非常便于理解&#xff0c;同時也更容易進行測試。 依賴注入的…

Jmeter筆記(Ⅱ)使用Jmeter實現輕量級的接口自動化測試

接口測試雖然作為版本的一環&#xff0c;但是也是有一套完整的體系&#xff0c;有接口的功能測試、性能測試、安全測試&#xff1b;同時&#xff0c;由于接口的特性&#xff0c;接口的自動化低成本高收益的&#xff0c;使用一些開源工具或一些輕量級的方法&#xff0c;在測試用…

設置Android Studio工程布局文件的默認布局

每次創建新的工程后&#xff0c;布局文件的的布局總是ConstraintLayout&#xff0c;如何更改&#xff1f; 進入Android Studio安裝目錄&#xff0c;用文本編輯器打開文件plugins\android\lib\templates\activities\common\root\res\layout\simple.xml.ftl 將文件內容修改為 <…

依賴注入簡介(二)

在上一篇中&#xff0c;我們已經介紹過了最基本的依賴注入&#xff0c;接下來我們來看如何對需要使用的類進行裝配。通常應用程序的組件之間的關聯是通過wiring&#xff0c;在Spring中同樣有很多方式來裝配。但是一個最通常我們使用的方法是利用XML。接下來我們來展示一個簡單的…

eclipse啟動tomcat 訪問http://localhost:8080 報404錯誤

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 eclipse正常啟動tomcat&#xff0c;但是 訪問http://localhost:8080 卻報404錯誤 修改下配置 就好操作如下圖 打開eclipse的server視圖&a…

3秒搞定!~~ 一億數據獲取前100個最大值

3秒搞定&#xff01;~~ 一億數據獲取前100個最大值 整合網絡上的算法。 根據我的思路。計算一億個數字中最大的前100個值。 昨晚效率還是很低。 今天搞的算法。 只需要3秒鐘。 獲取前100個 前1000個 速度都非常快。 算法原理&#xff1a; 把一億個數字的前100個 首先放入數…

手把手JDK環境變量配置

分為下載&#xff0c;配置&#xff0c;驗證三個步驟解釋如何進行JDK環境變量配置。 步驟一&#xff1a; 首先查看配置成功后的效果&#xff1a; tip:點擊win——>運行&#xff08;或者使用winr,或者shift鼠標右鍵打開powershell&#xff09;——>輸入cmd回車——>控制…

網易NEI在面臨前后端分離問題,所提供的完整解決方案

內容來源&#xff1a;2018 年 1 月5 日&#xff0c;網易NEI產品負責人包勇明在“2018移動技術創新大會”進行《網易高效多端應用協作開發實踐》演講分享。IT 大咖說&#xff08;微信id&#xff1a;itdakashuo&#xff09;作為獨家視頻合作方&#xff0c;經主辦方和講者審閱授權…

如何使用js動態顯示或隱藏DIV

在web頁面中&#xff0c;經常需要使用select控件來顯示div的顯示與隱藏&#xff0c;實現這個方法主要用到了setAttribute方法&#xff0c;以下為示例代碼 [html] view plaincopy <html> <title>通過選擇項顯示不同的結果</title> <head> <scr…

myeclipse進入Myeclipse configuration center 如何關閉

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 找到這個圖標&#xff0c;放上去顯示return即可關閉&#xff0c;隱藏很深有木有

程序員保持身心健康的八種方式

程序員是一個辛苦的行業&#xff0c;長時間面對的只是需要解決的問題&#xff0c;更不要提開發期限和無理取鬧的客戶了&#xff0c;這樣的工作簡直無以承受。怎么辦呢我們&#xff1f;我們熱愛編程&#xff0c;樂于創建功能……我們喜歡那種將一堆代碼弄成像Facebook或者Digg那…

[No0000166]CPU的組成結構及其原理

中央處理器(Central Processing Unit, CPU)CPU的基本架構和工作原理其實百科上講得已經相當清楚了&#xff0c;不過我覺得有些事情呢還是給個例子出來比較方便學習。本文會先從內存地址&#xff0c;計算機的一般架構之類的基礎知識出發&#xff0c;然后逐步為讀者"拼裝&qu…

Java 時間總結

轉載請標明出處&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/80613024 本文出自【趙彥軍的博客】 時區 整個地球分為二十四時區&#xff0c;每個時區都有自己的本地時間。為了統一起見&#xff0c;使用一個統一的時間&#xff0c;稱為通用協調時(UTC, Univer…

js中的var是什么意思

聲明&#xff08;創建&#xff09; JavaScript 變量 在 JavaScript 中創建變量經常被稱為“聲明”變量。您可以通過 var 語句來聲明 JavaScript 變量&#xff1a;var x; var carname; 在以上聲明之后&#xff0c;變量并沒有值&#xff0c;不過您可以在聲明它們時向變量賦值&…

HTTP/2 協議入門

一、2015年&#xff0c; HTTP/2發布。 二、二進制協議 HTTP/2是一個二進制協議&#xff0c;頭信息和數據體都是二進制&#xff0c;并且統稱為“幀”&#xff08;frame&#xff09;,頭信息幀和數據幀。 二進制協議的一個好處是&#xff0c;可以定義額外的幀。HTTP/2定義了近1…

態度決定高度

“一個將什么都不放在眼里的人&#xff0c;他的未來一定是一片黑暗&#xff0c;因為他什么都看不到”。知識的獲得和能力的鍛煉是個一點一滴慢慢積累的過程&#xff0c;這個過程需要我們端正態度&#xff0c;俯身求教。好高騖遠一直都是很多人容易犯的錯誤&#xff0c;這樣導致…