本节我们讲究如何利用Tomcat的ContextLoaderListener扩展接口来把Spring框架与Tomcat进行连接起来。
ContextLoaderListener一般用来启动一个Spring容器或者框架的根容器,例如Webx框架的WebxContextLoaderListener就是继承该类,实现了webx框架到Tomcat容器的衔接点,而SpringMVC则通过在ContextLoaderListener启动一个IOC来管理bo类的bean,下面首先看下ContextLoaderListener的类图结构:
可知ContextLoaderListener的两个方法都是含有一个ServletContextEvent类型的参数。
那么这个ContextLoaderListener一般是怎么使用的那?ContextLoaderListener一般是按照下面的方式配置到web.xml里面:
如上代码,首先创建了一个ContextLoaderListener实例,该实例会创建一个XmlWebApplicationContext应用程序上下文,contextConfigLocation是要告诉ContextLoaderListener要把哪些Bean注入到XmlWebApplicationContext管理的BeanFactory。
这里首先有几个问题,比如配置的全局的contextConfigLocation属性是怎么在ContextLoaderListener中获取的?ContextLoaderListener与Tomcat是什么关系那?ContextLoaderListener是如何创建的XmlWebApplicationContext?
为了解开前两个问题,我们需要看下Tomcat(本文tomcat版本为 apache-tomcat-8.5.12)中的一些代码时序图
privatefinalConcurrentMap<String,String>parameters=newConcurrentHashMap<>();
保存应用级别的变量信息。
下面看下ContextLoaderListener的contextInitialized方法时序图,看是如何创建XmlWebApplicationContext并获取到了contextConfigLocation变量的值作为Spring容器加载Bean的数据源:
SpringMvc是目前使用非常频繁的框架,springmvc里面经常会使用两级级联容器,并且每层容器都各有用途,使用过SpringMVC的童鞋都知道,一般我们在web.xml里面会配置一个listener和一个dispatcher,其实这就配置了两个spring IOC容器,并且dispatcher容器的父容器就是listener的容器。一般在web.xml里面配置如下:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
其中ContextLoaderListener会创建一个XMLWebApplicationContext上下文来管理contextConfigLocation配置的xml里面的普通bean,这个上节已经讲过。
DispatcherServlet也会创建一个XMLWebApplicationContext默认管理web-info/springmvc-servlet.xml里面的Controller bean,下面看下创建的流程时序图:
如图在DispatcherServlet的初始化方法中首先从ServletContext的全局变量表里面获取ContextLoaderListener创建的XMLWebApplicationContext上下文,然后使用该context作为父上下文创建了SpringMVC的servlet的context容器,并且设置namespace为springmvc-servlet,这个在查找配置文件时候用到,最后会拼接为springmvc-servlet.xml,最后刷新SpringMVC的servlet的context上下文。
一般我们在listener创建的父容器里面配置bo类用来具体操作业务,在dispatcher子容器里面配的Controller类,然后Controller里面具体调用bo类来实现业务。
至此结合上节通过Tomcat启动过程中调用ContextLoaderListener的contextInitialized方法首先创建了父容器用来管理bo bean,然后使用DispatcherServlet创建了子容器用来管理Controller bean ,ContextLoaderListener让SpringMVC与Tomcat容器联系起来了。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有