ContextLoaderListener 初始化过程.

本文详细介绍了ContextLoaderListener作为ServletContextListener的作用,它在Web应用加载时初始化资源,如数据库连接池和Spring的IOC容器。讲解了其配置、生命周期,并解析了相关名词如ServletContext、ServletConfig、XmlWebApplicationContext、DefaultListableBeanFactory和StandardContext。同时阐述了ContextLoaderListener的启动过程,包括在Tomcat中的具体步骤,以及如何创建和刷新WebApplicationContext。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ServletContextListener 生命周期

昨用:

监听 ServletContext 对象被创建或销毁的 Servlet 监听器,
在当前 WEB 应用被加载时对当前 WEB 应用的相关资源进行初始化操作:

如: 创建数据库连接池,创建Spring 的 IOC 容器,读取当前 WEB 应用的初始化参数等

配置:

在web.xml中进行配置:

<listener>
  <listener-class>com.java.javaweb.test.HelloServletContextListener</listener-class>
</listener>
生命周期:

contextInitialized: 在容器启动时被调用(在servlet被实例化前执行)
contextDestroyed: 在容器销毁时调用(在servlet被销毁后执行)


首先ContextLoaderListener接口是一个ServletContextListener

ContextLoaderListener 接口定义如下

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
    public ContextLoaderListener(WebApplicationContext context) {
        super(context);
    }
    @Override
    public void contextInitialized(ServletContextEvent event) {
        initWebApplicationContext(event.getServletContext());
    }
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }
}

名词解释:
1.serveltContext:

存储当前Web程序的上下文信息, 每个Engine有多个war包, 每个war包就是一个web应用程序, 每个web应用程序只有一个Context上下文,这就是servletContext.
每个servletcontext下可以有多个servlet, 每个servlet需要有配置url映射. 每个servlet需要被包装为StandardWrapper类, 存储到servletcontext容器中.
ServletContext 对象是一个为整个 web 应用提供共享的内存,多个servlet实例见可以通过context进行通信.
ServletContext 在tomcat中对应的类是ApplicationContext.

2.serveltConfig:

在tomcat中, ApplicationContext的装饰类ApplicationContextFacade即为config,

3.XmlWebApplicationContextSpring

在Spring 中, ContextLoaderListener监听器初始化的时候被创建, 并存入其静态属性ContextLoaderListener.currentContext属性中. 其是整个Spring框架执行的基础, 内部包含IOC容器, 关联Servlet上线文等信息

4.DefaultListableBeanFactory

Spring的核心模块,其就是IOC容器.

5.StandardContext

存在于Tomcat中, 是Host的子容器,是Web程序运行的所有servlet的容器, 管理整个web程序的生命周期.

这里写图片描述

这里写图片描述


ContextLoaderListener的启动过程:

ContextLoaderListener实现了ServletContextListener接口,ServletContextListener是Java EE标准接口之一,
类似tomcat,jetty的java容器启动时便会触发该接口的contextInitialized。

下面以Tomcat容器为例:
Tomcat最后一级容器为StandardContext, 在此容器中完成Listener监视器的实例化和初始化, 然后完成filter的初始化, 接着是所有配置load on start标签的servlet的实例化和初始化.

在ContextLoaderListener监视器初始化时首先调用方法.contextInitialized(), 该方法的参数是ServletContextEvent类型,该类包含真是的ServletContext对象.

这里写图片描述

1 所以第一步是启动方法 org.springframework.web.context.ContextLoaderListener#contextInitialized,注意传递进来的事件ServletContextEvent,

2.调用org.springframework.web.context.ContextLoader#initWebApplicationContext初始化监听器

3.org.springframework.web.context.ContextLoader#createWebApplicationContext(javax.servlet.ServletContext)
实例化XmlWebApplicationContext, 并赋值给ContextLoaderListener.context属性

4.调用configureAndRefreshWebApplicationContext方法
4.1 将SevletContext对象赋值给xmlWebApplication.servletContext属性

5.调用XmlWebApplicationContext.refresh方法, 重新载入所有bean

6.挡圈创建的webapplication保存到serletContext属性中,键值名为:.ROOT

6.记录XmlWebApplicationContext到静态属性 ContextLoaderListener.currentContext属性中, 这样全局webapplicationcontext就被永久记录下来了

7.xmlwebApplicationContext被以键值”org.springframework.web.context.WebApplicationContext.ROOT”存储在servletCotext属性中.

时间轴:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值