读Tomcat源码确定加载web.xml中节点元素的顺序

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

转载于点击打开链接

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

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

TomcatArchitecture from http://imtiger.net/

 

 

 

 

 

 

 

 

 

 

 

 

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

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

/**
* 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,那么就是按照配置参数默认从小到大排列启动。

内嵌式tomcat启动web工程 内嵌式tomcat启动web工程,maven代码 内嵌式tomcat启动web工程,maven代码 立即下载

相关推荐

Tomcat结构及处理请求过程

        Tomcat是一个基于组件形式的的Web容器,由Server(服务器)、Service(服务)、Connector(连接器)、Engine(引擎)、Host(主机)、Context(应用服务)组成,它们在server.xml里都有配置。 Tomcat的请求过程如图:Server:代表整个Tomcat,它包含所有的容器;Service:相当于一个集合,包含多个Connector(连接...

qq_34409900的博客 454

Tomcat应用 web.xml加载过程

server.xml中默认设置为 <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> 如此设置则会自动加载webapps下的文件夹或

lbl的博客 5981

Tomcat运行web程序过程及server.xml配置

在座各位老铁程序开发多年,想必Tomcat一直是都是你们的必用猫吧,在项目中配一下Tomcat,copy一份server.xml覆盖进来,就可以轻松愉快的把项目跑起来了。 但是..... 你们有没有想过Tomcat是怎么运行你们充满bug的程序的呢?server.xml里的这些垃圾配置又是什么用的呢? 下面,我附上一份花费多日呕心沥血制作而成的server.xml配置详...

gjj0981的专栏 190

Web.xml文件配置详解

可有可无,如果在web.xml中不写配置信息,默认的路径是/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。通常无需重写init()和destroy()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法,如果重写了init()方法,应在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。

KYGALYX的博客 1万+

内嵌tomcat使用方式(web.xml

【代码】内嵌tomcat使用方式(web.xml

huan1213858的博客 1414

详解web.xml元素加载顺序

  最近在项目中遇到了启动时出现加载service注解注入失败的问题,后来经过不懈努力发现了是因为web.xml配置文件中的元素加载顺序导致的,那么就抽空研究了以下tomcat在启动时web.xml文件中元素加载顺序,现在和大家分享。   遇到这种问题的时候,一般看源码是最直接和最权威的获取答案的方式,根据tomcat架构设计Context的实现类是StandardContext,全称...

laomumu1992的博客 299

tomcat web.xml加载顺序

一、整体流程 1、启动一个WEB项目的时候,WEB容器会去取它的配置文件web.xml取和两个结点。 2、紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。 3、容器将转换为键值对,并交给servletContext。 4、容器创建中的类实例,创建监听器。 二、说明 load-on-startup 元素web应用

chengzhezhijian的专栏 3196

Tomcat源码研究之web.xml元素加载顺序

本文主所关注的是web.xml文件各类元素的解析加载顺序

夫礼者的专栏 818

Tomcat源码深析之web.xml组件的处理

这篇文章主要是带着者通过分析Tomcat源码,深入了解Tomcatweb.xml配置的组件的的处理,文章内容主要包括Tomcat对上下文参数(contextParams),过滤器(Filters),应用监听器(listeners)以及Servlet的加载,初始化等等。 ...

264

web.xml 组件加载顺序

推荐阅    微服务:springboot系列教程学习    源码:Javaweb练手项目源码下载    调优:十五篇好文回顾    面试笔试:面试笔试整理系列在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要。 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前。经过查阅和Debug发现, web.xml组件加载顺序为:context-pa...

Java笔记虾 1422

tomcat加载web.xml顺序

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33767813的博客 133

SSM 框架 Web 项目在 TOMCAT 上运行

SSM 框架 Web 项目在 TOMCAT 上运行 Spring + SpringMVC +Mybatis 项目在 Tomcat 服务器上运行。 总的来说,web.xml加载顺序是:<context-param>--> <listener> --> <filter> --> <servlet>。 项目加载到 tomca...

RobertChao的博客 1806
上一篇: Spring源代码解析(二):IoC容器在Web容器中的启动
下一篇: 在web.xml中classpath和classpath*的区别
insistGoGo
博客等级 码龄15年 768粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值