博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring mvc ContextLoaderListener 原理解析
阅读量:6619 次
发布时间:2019-06-25

本文共 3144 字,大约阅读时间需要 10 分钟。

hot3.png

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。

org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml

ContextLoaderListener有什么用?提供什么功能呢?我们下面通过源码分析下。

ContextLoaderListener 源码分析

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {    public ContextLoaderListener() {    }    public ContextLoaderListener(WebApplicationContext context) {        super(context);    }    //web 容器启动时执行    @Override    public void contextInitialized(ServletContextEvent event) {        //初始化WebApplicationContext对象        initWebApplicationContext(event.getServletContext());    }    //web容器销毁时执行    @Override    public void contextDestroyed(ServletContextEvent event) {        closeWebApplicationContext(event.getServletContext());        ContextCleanupListener.cleanupAttributes(event.getServletContext());    }}

ContextLoaderListener 实现了ServletContextListener 接口。

ServletContextListener 接口我们知道是web容器创建的时候开始执行contextInitialized() 方法,web容器销毁时执行contextDestroyed() 方法。那我们就从contextInitialized() 方法开始分析。

contextInitialized() 方法

public void contextInitialized(ServletContextEvent event) {    //初始化WebApplicationContext对象    initWebApplicationContext(event.getServletContext());}

initWebApplicationContext() 方法

6aaf8a6f3e24532076e56a97685391a59ea.jpg

  1. 首先判断servletContext中是否存在WebApplicationContext实例,如果存在说明ServletContextListener在web.xml中多次声明,并抛出异常。
  2. 调用 createWebApplicationContext() 方法创建WebApplicationContext实例
  3. 调用configureAndRefreshWebApplicationContext() 方法通过WebApplicationContext进行解析web.xml中配置的applicationContext.xml。
  4. 把WebApplicationContext实例添加到ServletContext中

createWebApplicationContext()

e4771e032a2efbdc629c59273935ed67c98.jpg

  1. 调用 determineContextClass() 方法获取WebApplicationContext的Class实例
  2. 通过反射创建WebApplicationContext对象,并返回。

determineContextClass()

f935d412c82a3acfb33d0d7c792a7ead59a.jpg

  1. 首先判断 servletContext中是否存在contextClass,如果有则直接返回该Class 实例(默认是没有配置该值的)
  2. 从defaultStrategies中通过WebApplicationContext全类名(包名和类名)获取要实现WebApplicationContext接口的类。

defaultStrategies

d7c5d3eb126eec0354fc9b9553a9f7690e7.jpg

从当前类的路径下查找 ContextLoader.properties 并加载文件中的键值存储到 defaultStrategies中。

ContextLoader.properties

# Default WebApplicationContext implementation class for ContextLoader.# Used as fallback when no explicit context implementation has been specified as context-param.# Not meant to be customized by application developers.org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext

通过WebApplicationContext全类名获取它的实现类是XmlWebApplicationContext。

configureAndRefreshWebApplicationContext()

6cfcbf7a0d8fae1a7a9a3b3c06fc2b5a9f0.jpg

  1. 获取web.xml中配置的applicationContext.xml路径
  2. 调用refresh()进行加载xml,解析bean。

总结

通过代码分析ContextLoaderListener的作用就是启动Web容器的时候,初始化WebApplicationContext实例,并存放到ServletContext中。

ContextLoaderListener实现了ServletContextListener接口,在Web容器启动的时会默认执行它的contextInitialized() 方法,然后获取WebApplicationContext的实现类 XmlWebApplicationContext,并实例化后存放到ServletContext中,通过XmlWebApplicationContext类进行加载、解析applicationContext.xml 配置文件。ServletContext在整个Web容器范围内都有效,都可以获取得到。

XmlWebApplicationContext类的作用

4a4764ff991a086d59132c5bd8934869b11.jpg

e69b4867acf00405f52a7404e317a8443f4.jpg

通过代码可以大概了解到就是读取web.xml中配置的applicationContext.xml ,然后加载解析Bean信息。

转载于:https://my.oschina.net/u/2307589/blog/1834236

你可能感兴趣的文章
POJ 3335 Rotating Scoreboard 半平面交
查看>>
域名和网址链接被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决
查看>>
ubuntu下安装jdk
查看>>
python操作数据库-安装
查看>>
kuangbin专题七 POJ3264 Balanced Lineup (线段树最大最小)
查看>>
JS动画效果链接汇总
查看>>
P1197 [JSOI2008]星球大战
查看>>
XML转义字符
查看>>
wordpress拿WebShell
查看>>
校园的早晨
查看>>
oracle取前几行|中间几行|后几行
查看>>
16.1 Tomcat介绍
查看>>
十周三次课
查看>>
我的友情链接
查看>>
敏友的【敏捷个人】有感(11): 敏捷个人线下活动有感
查看>>
刺激用户危机意识,实现快速盈利的营销思维
查看>>
植物大战僵尸
查看>>
原创文章
查看>>
理解JavaScript私有作用域
查看>>
BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
查看>>