Tomcat 的 web.xml 文件中 load-on-startup 的作用是什么?
在 Tomcat 中,web.xml 文件里的 <load-on-startup> 元素用于控制 Servlet 或 Servlet 过滤器(Filter)是否在 Web 应用启动时就加载并初始化,而不是等到第一次请求时才加载。
作用说明:
控制 Servlet/Filter 的加载时机:
- 如果设置了
<load-on-startup>,对应的 Servlet 会在 Web 应用部署到容器(如 Tomcat)时立即被加载和初始化。 - 如果没有设置或为负数,Servlet 默认是在第一次请求到来时才被加载。
- 如果设置了
指定加载顺序:
<load-on-startup>的值是一个整数(可以为 0 或正整数)。- 数值越小,优先级越高,越早被加载。
- 例如:值为
1的 Servlet 会比值为2的 Servlet 先加载。 - 如果多个 Servlet 设置了相同的值,则加载顺序不确定(由容器决定)。
典型应用场景:
- 需要在应用启动时执行一些初始化逻辑,比如:
- 初始化数据库连接池
- 加载配置文件
- 启动后台线程或定时任务
- 预热缓存等
- 需要在应用启动时执行一些初始化逻辑,比如:
示例配置:
xml
<servlet>
<servlet-name>MyInitServlet</servlet-name>
<servlet-class>com.example.MyInitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
或者对于 Filter:
xml
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
<load-on-startup>1</load-on-startup>
</filter>
⚠️ 注意:
<load-on-startup>对 Filter 的支持取决于 Servlet 规范版本和具体容器实现。在 Servlet 3.0+ 中,Filter 也可以通过@WebFilter注解的initParams等方式控制加载,但显式使用<load-on-startup>更常见于 Servlet。
总结:
| 值 | 行为 |
|---|---|
| 未设置或负数 | 延迟加载(第一次请求时初始化) |
| 0 或正整数 | 启动时加载,数值越小越先加载 |
✅ 使用 <load-on-startup> 可以确保关键组件在应用启动时就准备好,提升首次请求的响应速度,并确保必要的初始化逻辑得以执行。