博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tomcat加载web.xml的顺序
阅读量:5995 次
发布时间:2019-06-20

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

hot3.png

有时候面试时会被问tomcat启动时web.xml中节点(类似listener,filter等)被加载的顺序,死记硬背那多没品,正好手里有tomcat7的源码,找了点时间翻了翻。

让我们先来喵一眼tomcat的架构,大致了解下tomcat启动的顺序,那我们目前关心的仅仅是web.xml中的加载顺序,按照架构来讲肯定是在Context中,架构如下图:

TomcatArchitecture from

在此输入图片描述

那我们就来到Context中寻找线索,按照tomcat架构设计Context的实现类是StandardContext,全称org.apache.catalina.core.StandardContext

看到其实现Lifecycle接口,我们在StandardContext中笑而不语的找到startInternal方法,看看我把暂时无语的代码去掉后的注释版

[java] view plaincopy在CODE上查看代码片派生到我的代码片 /**

  • Start this component and implement the requirements
  • of {@link org.apache.catalina.util.LifecycleBase#startInternal()}.
  • @exception LifecycleException if this component detects a fatal error
  • that prevents this component from being used */
    @Override
    protectedsynchronized void startInternal() throwsLifecycleException {
    //设置webappLoader 代码省略

// Standard container startup 代码省略

try{

// Set up the context init params 初始化context-param节点数据

mergeParameters();

// Configure and call application event listeners

//配置和调用listeners 也就是说开始监听
if(ok) {
if(!listenerStart()) {
log.error("Error listenerStart");
ok = false;
}
}

// Configure and call application filters

//配置和调用filters filters开始起作用
if(ok) {
if(!filterStart()) {
log.error("Error filterStart");
ok = false;
}
}

// Load and initialize all "load on startup" servlets

//加载和初始化配置在load on startup的servlets
if(ok) {
loadOnStartup(findChildren());
}

// Start ContainerBackgroundProcessor thread

super.threadStart();
}finally{
// Unbinding thread
unbindThread(oldCCL);
}

}

所以代码就是最好的文档就是这样,我们归纳一下代码

1:首先是context-param节点

2:接着配置和调用listeners 并开始监听

3:然后配置和调用filters filters开始起作用

4:最后加载和初始化配置在load on startup的servlets

另外赠送一枚彩蛋,也就是load on startup中的启动顺序是按照配置参数从小到大加载实例化的(小于0的忽略),

源代码中是用一个TreeMap,其中键为Integer,那么就是按照配置参数默认从小到大排列启动。

转载于:https://my.oschina.net/u/864548/blog/387668

你可能感兴趣的文章
MariaDB二之数据类型、字符大小写、变量
查看>>
Kubernetes1.10 ——二进制集群部署
查看>>
awk如何引用外部变量
查看>>
部置VMware Management Assistant-vMA
查看>>
我的友情链接
查看>>
High Level Google Doc
查看>>
Java异常处理-----抛出处理
查看>>
项目启动时注意事项
查看>>
排查 “Detected Tx Unit Hang”问题
查看>>
c++ 如何定义未知元素个数的数组?【转】
查看>>
angularjs $routeProvider template 函数及参数解惑
查看>>
Oracle 11g R2 常见问题处理
查看>>
aliyun_api_cmd.py——在命令行调用阿里云API
查看>>
Centos下***(pptpd)的部署
查看>>
操作无法完成。键入的打印机名不正确,或者指定的打印机没有连接到服务器上的解决办法!...
查看>>
struts2的restful
查看>>
Java基础加强-代理
查看>>
linux系统中实现多网卡的绑定
查看>>
6.Java集合-LinkedList实现原理及源码分析
查看>>
SP2与R2的区别之处
查看>>