SSM框架整合时web.xml配置(web容器间的关系理解)

每一个整合spring框架的项目中,都要在web.xml中加入这样一段配置

ContextLoaderListener继承自ContextLoader,实现的是ServletContextListener接口。

  • 继承ContextLoader有什么作用?

ContextLoaderListener可以指定在Web应用程序启动时载入Ioc容器,正是通过ContextLoader来完成Ioc容器的初始化工作。

  • 实现ServletContextListener又有什么作用?

ServletContextListener接口里的函数会结合Web容器的生命周期被调用。因为ServletContextListener是ServletContext的监听者,如果ServletContext发生变化,会触发相应的事件,而监听器一直对事件监听,如果接收到了变化,就会做出预先设计好的相应动作。由于ServletContext变化而触发的监听器的响应具体包括:服务器启动,ServletContext被创建的时候,服务器关闭,ServletContext被销毁的时候。

  • 那么ContextLoaderListener的作用是什么?

ContextLoaderListener的作用就是启动Web容器时,读取在contextConfigLocation中定义的xml文件,自动装配ApplicationContext的配置信息,并产生applicationcontext对象,然后将这个对象放置在ServletContext的域里(通过setAttribute方法),这样我们通过ServletContext就可以得到共享的applicationcontext对象(避免了new ClassPathApplicationContext(“applicationContext.xml”)的重复加载),并利用这个对象访问spring容器管理的bean(applicationcontext.getBean(类名.class))。
简单来说,就是为项目提供了spring支持,初始化了Ioc容器。

总结:

tomcat在启动时给每个Web应用(即项目工程)创建一个全局的上下文环境,这个上下文就是ServletContext,其为后面的Spring容器提供宿主环境。tomcat在启动过程中触发容器初始化事件,Spring的ContextLoaderListener会监听到这个事件,它的contextInitialized方法会被调用,在这个方法中,Spring会初始化全局的Spring容器(ApplicationContext),这个就是Spring的IoC容器。IoC容器初始化完毕后,Spring将其存储到ServletContext中,便于以后来获取。

tomcat在启动过程中还会扫描Servlet(即Java程序),一个Web应用中的Servlet可以有多个,以SpringMVC中的DispatcherServlet为例,这个Servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个Servlet请求。Servlet一般会延迟加载,当第一个请求达到时,Tomcat&Jetty发现DispatcherServlet还没有被实例化,就调用DispatcherServlet的init方法,DispatcherServlet在初始化的时候会建立自己的容器,叫做SpringMVC 容器,用来持有SpringMVC相关的Bean。同时,SpringMVC还会通过ServletContext拿到Spring容器,并将Spring容器设为SpringMVC容器的父容器。

注意:Spring MVC子容器可以访问Spring父容器中的Bean,但是Spring父容器不能访问SpringMVC子容器的Bean。说的通俗点就是,在Controller里可以访问Service对象,但是在Service里不可以访问Controller对象。

web容器间的关系示意图


版权声明:本文为qq_42098875原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。