Servlet的生命周期阶段
Servlet的生命周期由Servlet容器(如Tomcat)管理,主要分为以下阶段:
-
加载和实例化
容器通过类加载器加载Servlet类,并调用无参构造函数创建Servlet实例。通常发生在首次请求时或容器启动时(通过
<load-on-startup>配置)。 -
初始化(init)
调用
init(ServletConfig config)方法,完成一次性初始化操作(如加载资源)。该方法仅在生命周期内执行一次。若初始化失败,容器会卸载Servlet。 -
服务处理(service)
对于每个请求,容器调用
service()方法,并根据请求类型(GET/POST等)分发给doGet()、doPost()等具体方法。Servlet可同时处理多个请求(需注意线程安全)。 -
销毁(destroy)
容器在卸载Servlet前调用
destroy()方法,释放资源(如关闭数据库连接)。调用后实例被标记为垃圾回收。
关键方法说明
-
init(ServletConfig config)接收容器提供的配置参数(如
web.xml中的<init-param>),可通过getServletConfig()获取。 -
service(HttpServletRequest req, HttpServletResponse res)默认实现将请求分发给对应的
doXxx()方法。通常无需重写。 -
destroy()确保在方法内完成资源清理,避免内存泄漏。
线程安全注意事项
- Servlet实例默认是单例多线程的,避免在
service()或doXxx()中使用实例变量。 - 如需共享数据,使用同步块或线程安全集合(如
ConcurrentHashMap)。
配置示例(web.xml)
XML
<servlet>
<servlet-name>ExampleServlet</servlet-name>
<servlet-class>com.example.ExampleServlet</servlet-class>
<load-on-startup>1</load-on-startup> <!-- 启动时初始化 -->
<init-param>
<param-name>config</param-name>
<param-value>value</param-value>
</init-param>
</servlet>
生命周期图示
加载 → 实例化 → init() → (多次service()) → destroy() → 垃圾回收