#12.Spring MVC WebApplicationContext
###12.1 Servlet WebapplicationContext & Root WebApplicationContext
在Spring MVC中,__DispatcherServlet__用于接收请求并将请求分配到相应的__控制器(Controller)进行处理,我们可以称DispatcherServlet为__前端控制器。
在一个Spring MVC应用中,可以存在任意多个__DispatcherServlet__,例如处理__RestFul-WS__、__SOAP-WS__或__普通Web请求__等不同的目的,每一个DispatcherServlet都拥有各自的WebApplicationContext
上下文环境(用于定义与servlet级别相关的配置,例如controller,handler mapping,view resolving,i18n,theming,validation,type conversion和formatting的等等)。
在每一个WebApplicationContext
底层,Spring MVC同时还维护着一个Root WebApplicationContext
,Root WebApplicationContext定义应用级别(application-level)的上下文环境,例如底层数据源、安全、业务逻辑层、持久层等。Root WebAppilcationContext对所有的servlet级别(servlet-level)的WebApplicationContext都是可见的,反之则无效,也就是说,在Root WebApplicationContext定义的Bean对于所有的servlet-level的WebApplicationContext都是可见的,但是servlet-level的WebapplicationContext定义的Bean对Root WebApplicationContext卻不可见。
在Spring的官方文档中有这么一句话:
You simply need to wire up your business logic using an ApplicationContext and use a WebApplicationContext to integrate your web layer.
其中这个ApplicationContext指的就是Root WebApplicationContext。
###12.2 实例一
在使用STS创建Spring MVC项目时,STS会自动初始化web.xml配置文件,如下:
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这里有两个配置文件,分别是root-context.xml
和servlet-context.xml
。对应的root-context.xml就是上节提到的Root WebApplicationContext,servlet-context.xml就是servlet级别的WebApplicationContext。
###12.3 参考资料
- 《Pro Spring 3》
- 《spring-framework-reference》