IoC容器初始化之——WebApplicationContext
阿新 • • 發佈:2018-12-16
此文章為自己看《Spring4.x企業應用開發實戰》一書,總結的筆記,有錯誤請大家諒解並指點,謝謝大家~~
WebApplicationContext是什麼?
WebApplicationContext是專門從web根目錄的路徑中載入配置檔案進行初始化。
在WebApplicationContext中獲取ServletContext的引用,將web上下文物件放入ServletContext中,這樣web應用就可以訪問Spring應用上下文。
WebApplicationContext的實現方式是什麼?
Spring給WebApplicationContext提供了一個工具類WebApplicationContextUtils的getWebApplicationContext(ServletContext sc)的方法,從ServletContext中獲取WebApplicationContext例項。
getWebApplicationContext(ServletContext sc)方法的內部實現程式碼:
WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
WebApplicationContext與BeanFactory和Applicationcontext有什麼不同。
WebApplicationContext初始化不同於BeanFactory和ApplicationContext,因為WebApplicationContext需要ServletContext例項,它必須要有web容器才能啟動工作。
現在web開發都是需要在web.xml中配置web容器監聽器(也就是ServletContextListener)或者自定義Servlet。
Spring為WebApplicationContext分別準備了對應的Servlet和web容器監聽器: org.springframework.web.context.ContextLoadServlet。 org.springframework.web.context.ContextLoadListener。 二者內部都實現了WebApplicationContext載入例項的邏輯,只要在web.xml中配置就可以。
使用ContextLoaderListener啟動WebApplicationContext的web.xml配置
...
<!--指定配置檔案-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!--如果有多個用“,”隔開-->
/WEB-INF/XXXX.xml
</param-value>
</context-param>
<listerner>
<lister-class>org.springframework.web.context.ContextLoaderListener</lister-class>
</listerner>
...
ContextLoaderListener通過web容器上下文contextConfigLocation獲取Spring配置檔案位置。
使用ContextLoaderServlet啟動WebApplicationContext的web.xml配置
...
<!--指定配置檔案-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/XXXX.xml
<param-value>
</context-param>
<!--宣告servlet--> <servlet> <servlet-name>springContextLoaderServlet</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <!--啟動順序--> <load-on-startup>1</load-on-startup> </servlet> ...
Spring為WebApplicationContext分別準備了對應的Servlet和web容器監聽器: org.springframework.web.context.ContextLoadServlet。 org.springframework.web.context.ContextLoadListener。 二者內部都實現了WebApplicationContext載入例項的邏輯,只要在web.xml中配置就可以。
使用ContextLoaderListener啟動WebApplicationContext的web.xml配置
使用ContextLoaderServlet啟動WebApplicationContext的web.xml配置
<!--宣告servlet--> <servlet> <servlet-name>springContextLoaderServlet</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <!--啟動順序--> <load-on-startup>1</load-on-startup> </servlet> ...