博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC 第一章 - ContextLoaderListener
阅读量:6381 次
发布时间:2019-06-23

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

我们在使用SpringMVC的时候,做的第一件事情是配置ContextLoaderListener的监听器,这个监听器的作用,就是启动web容器的时候,自动装配ApplicationContext的配置信息,因为ContextLoaderListener实现了ServletContextListener接口,便会将ApplicationContext放置到servletContext中。

Spring - ContextLoaderListener 的源码解读

/** * Initialize the root web application context */@Overridepublic void contextInitialized(ServletContextEvent event) {   super.initWebApplicationContext(event.getServletContext());}
/** * Initialize Spring's web application context for the given servlet context,  */public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {     //  判断web.xml中存在多次ContextLoader定义     if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {      throw new IllegalStateException( "....");      }     try {      if (this.context == null) {            // 初始化context (重点)        this.context = createWebApplicationContext(servletContext);       }           if (this.context instanceof ConfigurableWebApplicationContext) {         ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context;        if (!cwac.isActive()) {            if (cwac.getParent() == null) {                ApplicationContext parent = loadParentContext(servletContext);                cwac.setParent(parent);              }            configureAndRefreshWebApplicationContext(cwac, servletContext);         }        }              // 将webApplicationContext放入到ServletContext中       servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);       ClassLoader ccl = Thread.currentThread().getContextClassLoader();       if (ccl == ContextLoader.class.getClassLoader()) {         currentContext = this.context;        }        else if (ccl != null) {        currentContextPerThread.put(ccl, this.context);        }             return this.context;    }        catch (RuntimeException ex) {                    }    }
创建contextClass这段代码就是创建webApplicationContext的核心,当前类的ContextLoader同样目录下一定会存在属性文件:ContextLoader.properties**org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext**然后通过反射的机制,进行实体类的创建protected Class
determineContextClass(ServletContext servletContext) { String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM); if (contextClassName != null) { return ClassUtils.forName(contextClassName, ClassUtils.getDefaultClassLoader()); } else { contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName()); return ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader()); }}

整个源码跟踪下来,可以简单的归纳一下:

  1. webApplicationContext存在性的验证
  2. 创建webApplicationContext实例
  3. 将实例记录在ServletContext中
  4. 映射当前类加载器与创建的实例到全局变量中
  5. static final Map currentContextPerThread = new ConcurrentHashMap<>(1);)

转载地址:http://pmhqa.baihongyu.com/

你可能感兴趣的文章
在linux下执行依赖多个jar的类的方法
查看>>
文件打开方式
查看>>
Oracle 11g R2 新特性
查看>>
微信小程序新手知识
查看>>
java中数据流的简单介绍
查看>>
根据物流号查看物流信息
查看>>
springboot传入json和文件_SpringBoot系列教程22-整合SpringMVC之HttpMessageConverters
查看>>
不礼让行人怎么抓拍的_张家川公安交警持续曝光机动车不礼让行人【第24期】...
查看>>
用pythonturtle写名字_去年爆款新生儿名字,家长自以为起的不错,却有“棺材”的意思...
查看>>
句子分类_语法微课句子的分类+文本讲解
查看>>
图形化分析工具_推荐一款基于小米 soar 的开源 sql 分析与优化的 web 图形化工具...
查看>>
485 工控机 接线方式_RS485温湿度传感器的接线方式及注意事项
查看>>
u3d游戏开发视频潭州_unity3d教程视频-unity3d教程中文零基础入门/u3d游戏开发/特效案例/项目实战V2.0 最新版 - 极光站...
查看>>
c++区块链实例_cpp 区块链模拟示例(二)工程代码解析
查看>>
java 接口的本质_Java基本概念:接口
查看>>
java死锁的解决_java中常见的死锁以及解决方法代码
查看>>
java菜单栏不下拉_我java代码中的下拉列表设好后为什么无法下拉?
查看>>
java传递引用类型的实质_java的引用类型以及值传递
查看>>
java策略模式使用场景,Java设计模式—策略模式
查看>>
RHEL6.3实现基于加密的用户认证验证访问
查看>>