Spring WebApplicationContext 介紹
目錄
一、ServletContext介紹
javaee標準規定了,servlet容器需要在應用專案啟動時,給應用專案初始化一個ServletContext作為公共環境容器存放公共資訊,ServletContext中的資訊都是由容器提供的。
在web專案中,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>
ServletContextListener的實現類程式碼如下(即上面的listener實現類):
public class ContextListenerTest implements ServletContextListener {
//容器啟動時執行該方法
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
String value = servletContext.getInitParameter("key");
System.out.println(" ContextListenerTest contextInitialized , key value is " + value + " .......");
}
//容器結束時執行該方法
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println(" ContextListenerTest contextDestroyed ......");
}
}
此時啟動Web容器,執行流程如下:
1、啟動一個WEB專案的時候,容器(如:Tomcat)會去讀它的配置檔案web.xml,讀兩個節點: <listener></listener> 和 <context-param></context-param>;
2、緊接著,容器建立一個ServletContext(上下文),在該應用內全域性共享;
3、容器將<context-param></context-param>轉化為鍵值對,並交給ServletContext;
4、容器建立<listener></listener>中的類例項,即建立監聽,該監聽器必須實現自ServletContextListener介面,如Log4jConfigListener,或者如上自定義實現類(如果不自定義實現,可以使用實現類ContextLoaderListener)
5、Web專案啟動中,在監聽類中ontextInitialized(ServletContextEvent event)初始化方法會被執行,在該方法中獲取到ServletContext和全域性引數;
6、得到這個context-param的值之後,你就可以做一些操作了。這個時候你的WEB專案還沒有完全啟動完成,這個動作會比所有的Servlet都要早。換句話說,這個時候,你對<context-param>中的鍵值做的操作,將在你的WEB專案完全啟動之前被執行。
7、Web專案結束時,監聽類中的contextDestroyed(ServletContextEvent event)方法會被執行;
簡單來說流程就是:1、讀配置檔案節點-->2、建立ServletContext-->3、設定引數到Context中-->4、監聽listener並執行初始化方法和銷燬方法。
二、Spring Web應用上下文配置
Spring分別提供了使用者啟動WebApplicationContext的Servlet和Web容器監聽器:
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.ContextLoaderServlet
所有版本的WEB容器都可以定義自啟動的Servlet,但只有2.3及以上的版本的WEB容器才支援Web容器監聽器,現在一般都使用Listener了。
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>
該監聽器,預設讀取/WEB-INF/下的applicationContext.xml檔案。但是通過context-param指定配置檔案路徑後,便會去你指定的路徑下讀取對應的配置檔案,並進行初始化。專案啟動時,便會執行類ContextLoaderListener的相關方法,建立WebApplicationContext(Web應用上下文)並以鍵值對形式存放與ServletContext中。
在web.xml中,可以配置多個Servlet,如下:
<servlet>
<init-param>
<param-name>param1</param-name>
<param-value>avalible in servlet init()</param-value>
</init-param>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>demo.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
SpringIOC容器先根據監聽初始化WebApplicationContext,然後再初始化web.xml中其他配置的servlet,為其初始化自己的上下文資訊servletContext,並載入其設定的配置資訊和引數資訊到該上下文中,將WebApplicationContext設定為它的父容器。所以最後的關係是ServletContext包含了WebApplicationContext,WebApplicationContext包含了其他的Servlet上下文環境。如下圖:
對於作用範圍而言,在DispatcherServlet中可以引用由ContextLoaderListener所建立的ApplicationContext中的內容,而反過來不行。
當Spring在執行ApplicationContext的getBean時,如果在自己context中找不到對應的bean,則會在父ApplicationContext中去找。這也解釋了為什麼我們可以在DispatcherServlet中獲取到由ContextLoaderListener對應的ApplicationContext中的bean。
三、總結
1、servlet容器需要在應用專案啟動時,給應用專案初始化一個ServletContext作為公共環境容器存放公共資訊。
2、WebApplicationContext,是繼承於ApplicationContext的一個介面,擴充套件了ApplicationContext,是專門為Web應用準備的,它允許從相對於Web根目錄的路徑中裝載配置檔案完成初始化。
3、在非web應用下,Bean只有singleton和prototype兩種作用域,WebApplicaitonContext為Bean新增了三個新的作用域:request/session/global session。
4、Spring分別提供了使用者啟動WebApplicationContext的Servlet和Web容器監聽器(ContextLoaderServlet/ContextLoaderListener);
5、WebApplicationContext實現類:
5-1、XmlWebApplicationContext
採用xml配置,則Spring將使用XmlWebApplicationContext啟動Spring容器,即通過XML檔案為Spring容器提供Bean的配置資訊;
5-2、AnnotationConfigWebApplicationContext
如果使用@Configure的java類提供配置資訊,則需要在xml中進行相關配置,設定contextClass引數值為AnnotationConfigWebApplicationContext類,contextConfigLocation引數值則為使用了@Configure註解的類。ContextLoaderListener如果發現配置了contextClass引數,就是使用引數所指定的實現類初始化容器。ApplicationContext介面也有對應的實現類AnnotationConfigApplicationContext。
參考:https://www.cnblogs.com/brolanda/p/4265597.html
相關文章
- Initializing Spring root WebApplicationContextSpringWebAPPContext
- Spring AOP介紹Spring
- Spring Cache 介紹Spring
- Spring AOT介紹Spring
- Spring Data JDBC介紹SpringJDBC
- spring框架的介紹Spring框架
- Spring bean詳細介紹SpringBean
- Spring BeanFactory與ApplicationContext 介紹SpringBeanAPPContext
- Spring AOP 增強介紹Spring
- Spring Shell入門介紹Spring
- Spring框架之IOC介紹Spring框架
- (2)Spring Cloud版本介紹SpringCloud
- spring-boot-starters介紹Springboot
- Spring 過濾器DelegatingFilterProxy No WebApplicationContext found: no ContextLoaderListener registered?Spring過濾器FilterWebAPPContext
- Spring Boot學習(一)——Spring Boot介紹Spring Boot
- 介紹Spring Cloud斷路器SpringCloud
- Spring的Factories機制介紹Spring
- Java之Spring Cloud概念介紹JavaSpringCloud
- Spring Cloud 中的元件介紹SpringCloud元件
- Spring Reactor基本介紹和案例SpringReact
- Spring 原始碼解析二:上下文元件(WebApplicationContext)Spring原始碼元件WebAPPContext
- 陪你解讀Spring Batch(一)Spring Batch介紹SpringBAT
- Spring原始碼分析——spring原始碼之obtainFreshBeanFactory()介紹Spring原始碼AIBean
- Spring Framework 參考文件(WebSocket介紹)SpringFrameworkWeb
- spring @component 的作用詳細介紹Spring
- 微服務 Spring cloud 各元件介紹微服務SpringCloud元件
- 4、Spring+AOP介紹與使用Spring
- Spring原始碼分析——spring原始碼核心方法refresh()介紹Spring原始碼
- Spring AOP 使用介紹,從前世到今生Spring
- Spring基礎只是—AOP的概念介紹Spring
- (7)Spring Boot Starter的介紹及使用Spring Boot
- Spring Cloud Stream 體系及原理介紹SpringCloud
- 精盡Spring MVC原始碼分析 - WebApplicationContext 容器的初始化SpringMVC原始碼WebAPPContext
- Spring 七種事務傳播性介紹Spring
- 原創:spring入門介紹第一講Spring
- Spring Security教程 Vol 9. AccessDecisionManager元件介紹Spring元件
- Spring Security教程 Vol 8. AccessDecisionVoter元件介紹Spring元件
- Spring Security方法級別授權使用介紹Spring