基于springmvc的web应用初始化流程和配置加载注意点

基于springmvc的web应用在初始化时做了什么?application context何时加载?有几种加载方式?

 

和所有的java web框架一样,springmvc实际上就是在典型的servlet处理request的流程上再包裹了一层而已。springmvc的初始化流程也同样和容器初始化servlet流程一样。容器初始化servlet上下文的流程如下,servlet context一般而言就是那个web.xml里设定上下文环境。

 

springmvc中最典型的ServletContextListener实现就是ContextLoaderListener,其重写的contextInitialized方法
定义了spring在初始化servletContext时的一些动作。
其会加载由context-param参数contextConfigLocation中指定的spring application context配置文件。
配置如下:

Xml代码 
  1. <context-param>  
  2.         <param-name>contextConfigLocation</param-name>  
  3.         <param-value>  
  4.             /WEB-INF/applicationContext.xml /WEB-INF/applicationContext2.xml  
  5.         </param-value>  
  6.     </context-param>  

 

使用 contextConfigLocation 加载指定路径的配置文件时,多个配置文件可以用逗号,冒号,空格, \t,\n 中任一个来分隔。

如果没有指定contextConfigLocation 参数,ContextLoaderListener会默认加载/WEB-INF/applicationContext.xml这个配置文件。

springmvc将由ContextLoaderListener 载入的application context 叫做 "root application context" ,以区别于servlet的application context。

ServletContextListener在servlet context里的配置参考如下:

Xml代码 
  1. <listener>  
  2.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  3.     </listener>  

 


如果没有在servlet context里配置,就不存在"root application context"。

springmvc可以配置多个servlet,每一个 servlet都拥有各自的application context,相互之间不能相互访问。但是"root application context"却是对所有servlet都是可见的。

如果servlet直接使用DispatcherServlet,其application context在DispatcherServlet的init 方法被调用时初始化。
servlet application context的加载策略类似于root application context,首先会查找是否配置了servlet的init-param "contextConfigLocation",如果有,就使用 contextConfigLocation 指定的路径加载的配置文件时,多个配置文件可以用逗号,冒号,空格, \t,\n 中任一个来分隔。


如果没有指定"contextConfigLocation"参数,则会在   /WEB-INF/下查找 "servlet-name"+"-servlet.xml" 这样的文件加载。如下配置所示,就是/WEB-INF/springDispatcherServlet-servlet.xml 。

Xml代码 
  1. <servlet>  
  2.         <servlet-name>springDispatcherServlet</servlet-name>  
  3.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.         <init-param>  
  5.             <param-name>contextConfigLocation</param-name>  
  6.             <param-value>  
  7.                 /WEB-INF/servlet-applicationContext.xml  
  8.             </param-value>  
  9.         </init-param>  
  10.         <load-on-startup>1</load-on-startup>  
  11.     </servlet>  
  12.   
  13.     <servlet-mapping>  
  14.         <servlet-name>springDispatcherServlet</servlet-name>  
  15.         <url-pattern>/mvc/*</url-pattern>  
  16.     </servlet-mapping>  

 


最后,该servlet application context将root application context设置为parent,然后加载完成。

以后在应用里调用applicationContext或者beanFactory的getBean方法去获取实例的时候,都是先尝试从父级application context获取,获取不到,再到当前application context里获取。

除此之外,我们还可以在某个类里以编程式加载application context,比如使用ClassPathXmlApplicationContext或FileSystemXmlApplicationContext。不过这样加载的application context和root application context和servlet application context 分属于不同的可见范围。

posted @ 2013-09-29 13:58  做一个GENTALMAN  阅读(332)  评论(0编辑  收藏  举报