技术开发 频道

Spring MVC快速入门

初始化Web模块的WebApplicationContext

    现在我们解决了第一个问题,但DispatcherServlet究竟如何初始化其上下文所对应的WebApplicationContext并完成和业务层、持久层WebApplicationContext的整合呢?当Web容器启动时,Spring通过ContextLoaderListener 监听器初始化业务层和持久层所对应的Spring容器(WebApplicationContext)。接着作为自动启动的DispatcherServlet开始初始化,它利用相应的Spring配置文件初始化DispatcherServlet上下文所对应的子Spring容器(WebApplicationContext),并将业务层、持久层的Spring容器作为其父容器,这种父子容器的结构带来了两个明显的好处:

1)允许展现层和业务层、持久层更好地解耦,因为展现层的Bean定义在子容器中,而业务层和持久层的Bean定义在父容器中,子容器可以访问父容器的Bean,而父容器访问不到子容器中的Bean;

2)允许分步骤初始化不同层次的Spring容器。通过ContextLoaderListener配合使用contextConfigLocation上下文参数初始化业务层、持久层的Spring容器,然后再通过DispatcherServlet初始化展现层的子Spring容器。 

    父Spring容器的Spring配置文件在①中定义,DispatcherServlet上下文所用到的Bean也需要一个Spring配置文件进行定义,但在②处的配置中,我们并没有看到预想中配置文件的身影。探其原因,原来是DispatcherServlet将按照默认契约机制进行工作,它自动查找WEB-INF/<servlet-name>-servlet.xml(即WEB-INF/baobaotao-servlet.xml)的配置文件,使用该配置文件初始化DispatcherServlet上下文对应的子Spring容器。

    实际上,你可以配置多个DispatcherServlet分别处理不同URL模式的请求,每个DispatcherServlet上下文都对应一个自己的子Spring容器,它们拥有相同的父Spring容器(业务层、持久层Bean所在的容器),形成图 2所示的层次结构:


                图 2 展现层和业务层、持久层的Bean分属于不同Spring容器中 

    DispatcherServlet规定了很多无需配置的默认契约,但都可以通过显式配置进行调整。DispatcherServlet拥有多个可配置的属性,但DispatcherServlet位于web.xml中而非在Spring配置文件中,我们如何配置DispatcherServlet的属性呢?

    研究DispatcherServlet类的继承体系,我们可以发现它继承于FrameworkServlet,而FrameworkServlet又继承于HttpServletBean。HttpServletBean这个类的名字是否让你得到了某些启示呢?是的,HttpServletBean通过扩展HttpServlet让其具备了类似于Bean的特征 ——你可以在web.xml中通过<init-param>采用类似于在Spring配置文件中的方式配置HttpServletBean的属性,请看下面的配置片断:

代码清单 2 通过Servlet初始化参数配置DispatcherServlet属性


<servlet>
<servlet-name>baobaotao</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param> ①通过Servlet的初始化参数配置DispatcherServlet的属性
<param-name>namespace</param-name> ①-1 属性名
<param-value>bbt</param-value> ①-2 属性值
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>


在①处,我们通过定义了一个namespace的初始化参数,DispatcherServlet将调用自身的setNamespace()方法将“bbt”设置为nameSpace属性的值。可按照相似方式配置的属性一并介绍如下:

namespace:DispatcherServlet对应的命名空间,用以构造Spring配置文件的路径,如果指定该属性后,配置文件对应的路径为:WEB-INF/<namespace>.xml而非WEB-INF/< servlet-name>.xml。按照上面配置对应的配置文件为WEB-INF/bbt.xml;

contextConfigLocation:如果DispatcherServlet上下文对应的Spring配置文件有多个,则可以使用该属性按照Spring资源路径的方式进行指定。如设置为“classpath:bbt1.xml,classpath:bbt2.xml”时,DispatcherServlet将使用类路径下的bbt1.xml和bbt2.xml这两个配置文件初始化WebApplicationContext;

publishContext:boolean类型属性,默认值为ture。DispatcherServlet据此属性决定是否将对应的WebApplicationContext发布到ServletContext的属性中,以便任何其它的Bean可以通过ServletContext找到DispatcherServlet上下文对应的WebApplicationContext,对应的属性名为DispatcherServlet#getServletContextAttributeName()方法返回的值。

publishEvents:boolean类型属性。当DispatcherServlet处理完一个请求后,是否需要向容器发布一个ServletRequestHandledEvent事件,默认为ture。如果容器中没有任何事件监听器,可以将此属性设置为false,以便赚取一些程序运行性能。
0
相关文章