用户第一次请求
- Tomcat服务器通过反射机制,调用无参数构造方法,创建Servlet对象。
- Tomcat服务器调用Servlet对象的init方法完成初始化。
- Tomcat服务器调用Servlet对象的service方法处理请求。
用户第二次到第n次请求
- Tomcat服务器调用Servlet对象的service方法处理请求。
- …
- Tomcat服务器调用Servlet对象的service方法处理请求。
服务器关闭
- Tomcat服务器调用Servlet对象的destroy方法,做销毁之前的准备工作。
- Tomcat服务器销毁Servlet对象。
LifeCycleServlet.java
public class LifeCycleServlet implements Servlet {
// 不建议手动编写构造方法,因为可能导致Servlet对象无法实例化
// 无参构造,在对象实例化时执行
public LifeCycleServlet() {
System.out.println("LifeCycleServlet的无参数构造方法执行了!");
}
// init方法通常是用来完成初始化操作的,只在对象实例化后执行一次,与无参构造方法几乎在同一时间执行
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("LifeCycleServlet的init方法执行了!");
}
// service方法是处理用户请求的核心方法,用户发送一次请求就执行一次
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("LifeCycleServlet的service方法执行了!");
}
// destroy方法只在对象销毁之前调用一次
@Override
public void destroy() {
System.out.println("LifeCycleServlet的destroy方法执行了!");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
web.xml
LifeCycleServlet cn.lwx.javaweb.servletLifeCycle.LifeCycleServlet LifeCycleServlet /life
默认情况下服务器启动的时候LifeCycleServlet对象并没有被实例化
用户发送第一次请求的时候,控制台输出了以下内容:
LifeCycleServlet的无参数构造方法执行了! LifeCycleServlet的init方法执行了! LifeCycleServlet的service方法执行了!
根据以上输出内容得出结论:
- 用户在发送第一次请求的时候Servlet对象被实例化(LifeCycleServlet的无参数构造方法被执行了)
- LifeCycleServlet对象被创建出来之后,Tomcat服务器马上调用了LifeCycleServlet对象的init方法。
- 用户发送第一次请求的时候,init方法执行之后,Tomcat服务器马上调用AServlet对象的service方法。
用户继续发送第二次请求,控制台输出了以下内容:
LifeCycleServlet的service方法执行了!
根据以上输出结果可得,用户在发送第二次,或者第三次,或者第四次请求的时候,Servlet对象并没有新建,还是使用之前创建好的Servlet对象,直接调用该Servlet对象的service方法,这说明:
- Servlet对象是单例的(单实例的。但是要注意:Servlet对象是单实例的,但是Servlet类并不符合单例模式。我们称之为假单例。之所以单例是因为Servlet对象的创建我们javaweb程序员管不着,这个对象的创建只能是Tomcat来说了算,Tomcat只创建了一个,所以导致了单例,但是属于假单例。真单例模式,构造方法是私有化的。)
- 无参数构造方法、init方法只在第一次用户发送请求的时候执行。也就是说无参数构造方法只执行一次。init方法也只被Tomcat服务器调用一次。
- 只要用户发送一次请求,service方法必然会被Tomcat服务器调用一次。
关闭服务器的时候,控制台输出了以下内容:
LifeCycleServlet的destroy方法执行了!
根据以上输出内容得出结论:
- Servlet的destroy方法只被Tomcat服务器调用一次。
- destroy方法是在服务器关闭的时候被调用。
- 因为服务器关闭的时候要销毁AServlet对象的内存。
- 服务器在销毁 LifeCycleServlet 对象内存之前,Tomcat服务器会自动调用LifeCycleServlet对象的destroy方法。
总结:
- 构造方法只在Servlet对象被实例化时执行一次。
- init方法只在Servlet对象被实例化后执行一次。
- service方法在用户发送一次请求时执行一次,发送N次请求则执行N次。
- destroy方法只在对象销毁时执行一次。



