Spring MVC与Web环境(一):IOC容器在Spring MVC中的启动

            在原书的阅读中我们可以看到,Spring并不是天生就能在Web容器中起作用的。我们同样需要把我们的IoC容器手动添加到Web容器中,也就是在web.xml文件中配置一些基础的类比如DispatcherServlet,ContextLoaderListener这些我们熟悉的类。当这些类的配置完成之后,启动tomcat。就会在IoC容器中生成这些处理我们请求的bean。在DispatcherServlet类中,通常配置和访问前端页面的一些增强,以及数据提交时的一些准备工作。比如字符集过滤器,以及文件上传相关的类的配置。ContextLoaderListener则是和我们的Dao层息息相关,涉及到数据库的连接,mybatis和spring的集成。可以说DispatcherServlet和ContextLoaderListener提供了Web容器中对Spring的入口。ServletContext为Spring的IoC容器提供了一个宿主环境,在这个宿主环境中建立起一个IoC容器的体系。这个IoC容器体系是通过ContextLoaderListener的初始化来建立的。然后,把DispatcherServlet这几个Servlet作为Spring MVC处理Web请求的转发器建立起来。

            那么就下来进入正题,我们来看看IoC容器在SpringMVC中的启动

   1.  Web容器中的上下文(上下文是我们向Web容器提供配置信息的文件)

            IoC容器的启动过程建立上下文的过程,该上下文是与ServletContext相伴而生的,同时也是IoC容器在Web应用环境中的具体表现之一。我们称由ContextLoaderListener启动的上下文为根上下文。在这个根上下文的基础上,还有一个与Web MVC相关的上下文用来保存控制器(DispatcherServlet)需要的MVC对象,作为根上下文的子上下文,构成了一个层次化的上下文体系。

我们首先来看一下WebApplicationContext。这个类继承了ApplicationContext接口,这是一个Web容器。

ServletContext getServletContext();

   这里面有一个获取Servlet上下文环境的方法。在启动过程中,Spring会使用一个默认的WebApplicationContext实现作为IoC容器。这个默认使用的是XmlWebApplicationContext。这个类增加了对Web环境和Xml配置定义的处理。在这个类的初始化过程中,我们的Spring应用会全部建立起来。在这个类中,我们可以看到。默认的根上下文配置文件是

public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";

这个类中同样有loadDefinitions。就像我们在开始在初始化我们的容器的时候加载所有类的定义。这些代码的实现原理和IoC容器都是相同的。所以我不再叙述。

     2.ContextLoader建立Web环境上下文

对于Spring承载的Web应用而言,可以指定在Web应用程序启动时载入IoC容器(WebContextLoader)。这个功能是由诸如ContextLoaderListener这样的类来完成的,它是在Web容器中配置的监听器。我们可以理解为它持有了根上下文,当我们需要请求根上下文中涉及到的配置信息,就要通过这个类来进行调用。

现在我们来看一下ContextLoaderListener的实现原理

首先,这个监听器是启动根IoC容器并把它载入到Web容器的主要功能模块,也是整个Spring Web应用加载IoC的第一个地方。

这个监听器需要获取一个ServletContext,也就是读取到的上下文文件。这个是从web.xml中获取到的。接着这个ContextLoader会实例化WebApplicationContext

public void contextInitialized(ServletContextEvent event) {
		initWebApplicationContext(event.getServletContext());
	}

这个地方调用的是父类ContextLoader的方法。

ContextLoaderListener是一个监听器,它对我们的ServletContext进行监听。如果我们需要请求到WebApplicationContext的服务时,我们就需要通过ContextLoaderListener持有的WebApplicationContext来获取到相应的服务。在服务器启动时,调用了contextInitialized(ServletContextEvent)方法。在服务器关闭时,调用了contextDestroyed(ServletContextEvent)进行销毁。

具体的初始化工作交由ContextLoader来完成,可以看到是在这个地方读取到的根上下文来配置我们的WebApplicationContext容器。

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";

 

这样我们的WebApplicationContext容器就创建起来了。这个容器交由ContextLoaderListener持有并监听。下次将进入Spring Web MVC的重点。Spring MVC的启动和初始化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值