SpringMVC 第一章 - ContextLoaderListener

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

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

Spring - ContextLoaderListener 的源码解读

/**
 * Initialize the root web application context
 */
@Override
public 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);)
目录
相关文章
|
SQL Java Spring
SpringMVC解析2-ContextLoaderListener
对于SpringMVC功能实现的分析,我们首先从web.xml开始,在web.xml文件中我们首先配置的就是ContextLoaderListener,那么它所提供了功能有哪些又是如何实现的?当使用编程方式的时候我们可以将spring配置传入到Spring容器中,如: ApplicationCon...
842 0
|
7月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
6月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
89 1
|
6月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
7月前
|
前端开发 Java 关系型数据库
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
|
6月前
|
XML Java 数据格式
SpringMVC的XML配置解析-spring18
SpringMVC的XML配置解析-spring18
|
6月前
|
应用服务中间件
从代码角度戳一下springMVC的运行过程-spring16
从代码角度戳一下springMVC的运行过程-spring16
|
前端开发 Java Go
Spring MVC 和 Spring Boot 的区别
Spring MVC 和 Spring Boot 的区别
226 0
|
7月前
|
移动开发 Java 测试技术
Spring MVC+Spring+Mybatis实现支付宝支付功能(附完整代码)
Spring MVC+Spring+Mybatis实现支付宝支付功能(附完整代码)
180 1
|
7月前
|
Java Apache vr&ar
springmvc报错 nested exception is org.mybatis.spring.MyBatisSystemException:
springmvc报错 nested exception is org.mybatis.spring.MyBatisSystemException: