spring中的web上下文,spring上下文,springmvc上下文區別(超詳細)


web上下文(Servlet context),spring上下文(WebApplication Context),springmvc上下文(mlWebApplicationCont)之間區別.

上下文:可以簡單的理解為容器,配置文件

web上下文目標對象是所有web應用,spring上下文目標對象是單個web應用,spring mvc目標對象是單個web應用的spring mvc框架(是spring上下文的子上下文,即繼承自spring上下文,所以子能夠調用父的東西,反之,不可)。

以上感覺自己理解有偏差,看到一篇不錯的,先markdow

原文鏈接

一、先說ServletContext

  javaee標准規定了,servlet容器需要在應用項目啟動時,給應用項目初始化一個ServletContext作為公共環境容器存放公共信息。ServletContext中的信息都是由容器提供的。

舉例: 
通過自定義contextListener獲取web.xml中配置的參數 1.容器啟動時,找到配置文件中的context-param作為鍵值對放到ServletContext中 2.然后找到listener,容器調用它的contextInitialized(ServletContextEvent event)方法,執行其中的操作 例如:在web.xml中配置

<context-param> <param-name>key</param-name> <param-value>value123</param-value> </context-param> <listener> <listener-class>com.brolanda.contextlistener.listener.ContextListenerTest</listener-class> </listener>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

配置好之后,在該類中獲取對應的參數信息

package com.brolanda.contextlistener.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ContextListenerTest implements ServletContextListener { public void contextDestroyed(ServletContextEvent event) { System.out.println('*************destroy ContextListener*************'); } @SuppressWarnings('unused') public void contextInitialized(ServletContextEvent event) { System.out.println('*************init ContextListener*************'); ServletContext servletContext = event.getServletContext(); System.out.println('key:'+servletContext.getInitParameter('key')); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

執行流程:

  web.xml在標簽中聲明應用范圍內的初始化參數 
1.啟動一個WEB項目的時候,容器(如:Tomcat)會去讀它的配置文件web.xml.讀兩個節點: 和 2.緊接着,容器創建一個ServletContext(上下文)。在該應用內全局共享。

3.容器將轉化為鍵值對,並交給ServletContext. 
4.容器創建中的類實例,即創建監聽.該監聽器必須實現自ServletContextListener接口

5.在監聽中會有contextInitialized(ServletContextEvent event)初始化方法 
在這個方法中獲得ServletContext = ServletContextEvent.getServletContext(); 
“context-param的值” = ServletContext.getInitParameter(‘context-param的鍵’); 6.得到這個context-param的值之后,你就可以做一些操作了.注意,這個時候你的WEB項目還沒有完全啟動完成.這個動作會比所有的Servlet都要早.換句話說,這個時候,你對中的鍵值做的操作,將在你的WEB項目完全啟動之前被執行. web.xml中可以定義兩種參數: 一個是全局參數(ServletContext),通過 一個是servlet參數,通過在servlet中聲明    param1 avalible in servlet init() 第一種參數在servlet里面可以通過getServletContext().getInitParameter(‘context/param’)得到 第二種參數只能在servlet的init()方法中通過this.getInitParameter(‘param1’)取得

二、spring上下文容器配置

  spring為我們提供了實現ServletContextListener接口的上下文初始化監聽器:org.springframework.web.context.ContextLoaderListener

  spring為我們提供的IOC容器,需要我們指定容器的配置文件,然后由該監聽器初始化並創建該容器。要求你指定配置文件的地址及文件名稱,一定要使用:contextConfigLocation作為參數名稱。

<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-INF/jason-servlet.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

該監聽器,默認讀取/WEB-INF/下的applicationContext.xml文件。但是通過context-param指定配置文件路徑后,便會去你指定的路徑下讀取對應的配置文件,並進行初始化。

三、spring上下文容器配置后,初始化了什么?

  既然,ServletContext是由Servlet容器初始化的,那spring的ContextLoaderListener又做了什么初始化呢? 
1、servlet容器啟動,為應用創建一個“全局上下文環境”:ServletContext 2、容器調用web.xml中配置的contextLoaderListener,初始化WebApplicationContext上下文環境(即IOC容器),加載context-param指定的配置文件信息到IOC容器中。WebApplicationContext在ServletContext中以鍵值對的形式保存 3、容器初始化web.xml中配置的servlet,為其初始化自己的上下文信息servletContext,並加載其設置的配置信息到該上下文中。將WebApplicationContext設置為它的父容器。 4、此后的所有servlet的初始化都按照3步中方式創建,初始化自己的上下文環境,將WebApplicationContext設置為自己的父上下文環境。

對於作用范圍而言,在DispatcherServlet中可以引用由ContextLoaderListener所創建的ApplicationContext中的內容,而反過來不行。 當Spring在執行ApplicationContext的getBean時,如果在自己context中找不到對應的bean,則會在父ApplicationContext中去找。這也解釋了為什么我們可以在DispatcherServlet中獲取到由ContextLoaderListener對應的ApplicationContext中的bean。

四、spring配置時:的使用原因,為什么在applicationContext.xml中排除controller,而在spring-mvc.xml中incloud這個controller 
既然知道了spring的啟動流程,那么web容器初始化webApplicationContext時作為公共的上下文環境,只需要將service、dao等的配置信息在這里加載,而servlet自己的上下文環境信息不需要加載。故,在applicationContext.xml中將@Controller注釋的組件排除在外,而在dispatcherServlet加載的配置文件中將@Controller注釋的組件加載進來,方便dispatcherServlet進行控制和查找。故,配置如下: applicationContext.mxl中:

  <context:component-scan base-package='com.linkage.edumanage'> <context:exclude-filter expression='org.springframework.stereotype.Controller' type='annotation' /> </context:component-scan> spring-mvc.xml中: <context:component-scan base-package='com.brolanda.cloud' use-default-filters='false'> <context:include-filter expression='org.springframework.stereotype.Controller' type='annotation' /> </context:component-scan> 

1

2

  • 3
  • 4
  • 5
  • 6
  • 7

 

 

package com.brolanda.contextlistener.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ContextListenerTest implements ServletContextListener { public void contextDestroyed(ServletContextEvent event) { System.out.println('*************destroy ContextListener*************'); } @SuppressWarnings('unused') public void contextInitialized(ServletContextEvent event) { System.out.println('*************init ContextListener*************'); ServletContext servletContext = event.getServletContext(); System.out.println('key:'+servletContext.getInitParameter('key'));

小知識: 
1.為什么要在spring-mvc.xml過濾器添加 use-default-filters=’false’。 
答:因為use-default-filters用來指示是否自動掃描帶有 
@Component、@Repository、@Service和@Controller的類。默認為true,即默認掃描。而我們要求只是掃描Controller.

相關鏈接

2.為什么spring中的掃包要除去controller,spring mvc中只掃controller(pring MVC管理Controller,Spring 管理Controller之外的Bean)。 
答:這個跟spring mvc的工作流程有關,spring mvc主要bean就是實現了Controller接口的controller類.看圖:

其中Handler Mapping是一個xxx-servlet.xml文件,這個是DispatchServlet上下文(注意是DispatchServlet的)配置文件,里面配置了對於不同url即請求對應的控制器.

相關JSP學習推薦人民郵電出版社的JSP程序設計(page 230有spring mvc內容)。

不過我自身殘留個疑問,既然spring mvc的上下文繼承了spring的上下文,那么其實spring mvc把全部包都掃了好像也不會出問題,只不過把繼承至父類的bean覆蓋掉而已,待解決.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM