在web.xml中配置監聽器來控制ioc容器生命週期
阿新 • • 發佈:2018-11-11
、整合關鍵-在web.xml中配置監聽器來控制ioc容器生命週期 原因:
1、配置的元件太多,需保障單例項
2、專案停止後,ioc容器也需要關掉,降低對記憶體資源的佔用。 專案啟動建立容器,專案停止銷燬容器。
利用ServletContextListener監控專案來控制。 Spring提供了了這樣的監控器:
在web.xml配置監聽器:
<!-- 監聽專案的建立和銷燬,依據此來建立和銷燬ioc容器 --> <!-- needed for ContextLoaderListener --> <context-param> <!-- 指定Spring配置檔案位置 --> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- Bootstraps the root web application context before servlet initialization --> <!--專案啟動按照配置檔案指定的位置建立容器,專案解除安裝,銷燬容器 --> <listener> <!-- 載入jar包:org.springframework.web --> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
開啟
ContextLoaderListener原始碼發現其實現了ServletContextListener,其中有兩個方法,一個建立容器,一個銷燬容器
public class ContextLoaderListener extends ContextLoader implements ServletContextListener { //... /** * Initialize the root web application context. */ @Override public void contextInitialized(ServletContextEvent event) { initWebApplicationContext(event.getServletContext()); } /** * Close the root web application context. */ @Override public void contextDestroyed(ServletContextEvent event) { closeWebApplicationContext(event.getServletContext()); ContextCleanupListener.cleanupAttributes(event.getServletContext()); } }
ContextLoader
初始化WebApplicationContext
由下面的核心程式碼可知,建立容器後得到一個context物件 public WebApplicationContext initWebApplicationContext(ServletContext servletContext) { //建立容器 if (this.context == null) {
//private WebApplicationContext context;就是我們的ioc容器
this.context = createWebApplicationContext(servletContext); } }
context;就是我們的ioc容器,context有很多方法,
由上圖可知getCurrentWebApplicationContext()方法可以獲取當前的ioc容器。
public static WebApplicationContext getCurrentWebApplicationContext() { ClassLoader ccl = Thread.currentThread().getContextClassLoader(); if (ccl != null) { WebApplicationContext ccpt = currentContextPerThread.get(ccl); if (ccpt != null) { return ccpt; } } return currentContext; }
getCurrentWebApplicationContext()屬於ContextLoader類的,因為屬於static,所以監聽器來控制ioc容器生命週期 程式碼如下:
private static ApplicationContext ioc = ContextLoader.getCurrentWebApplicationContext();