tomcat源码探索之ServletContainerInitializer执行时机

ServletContextListener和ServletContainerInitializer实现类的处理时机

今天我们一起来探索一下,ServletContextListener和ServletContainerInitializer实现类的处理时机
选用的tomcat版本 8.5.50

ServletContainerInitializer

1.执行链路见下图:
ServletContainerInitializer
2.关键代码在org.apache.catalina.core.StandardContext#startInternal里边

for (Map.Entry<ServletContainerInitializer, Set<Class<?>>> entry :
    initializers.entrySet()) {
    try {
entry.getKey().onStartup(entry.getValue(),getServletContext());
    } catch (ServletException e) {
        log.error(sm.getString("standardContext.sciFail"), e);
        ok = false;
        break;
    }
}

spring在servlet3.0后就使用了ServletContainerInitializer这种机制,来初始化spring上文

ServletContextListener

1.执行链路见下图:
ServletContextListener
2.关键代码在org.apache.catalina.core.StandardContext#listenerStart里边

for (int i = 0; i < instances.length; i++) {
    if (!(instances[i] instanceof ServletContextListener))
        continue;
    ServletContextListener listener =
        (ServletContextListener) instances[i];
    try {
        fireContainerEvent("beforeContextInitialized", listener);
        if (noPluggabilityListeners.contains(listener)) {
            listener.contextInitialized(tldEvent);
        } else {
            listener.contextInitialized(event);
        }
        fireContainerEvent("afterContextInitialized", listener);
    } catch (Throwable t) {
        ExceptionUtils.handleThrowable(t);
        fireContainerEvent("afterContextInitialized", listener);
        getLogger().error
            (sm.getString("standardContext.listenerStart",
                          instances[i].getClass().getName()), t);
        ok = false;
    }
}

在servlet3.0之前都是采用ServletContextListener这种机制来初始化spring上下文。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值