Servlet的生命周期
init -> service -> destroy
默认情况下,开始容器(Tomcat)后,
第一次请求时,Servlet会进行实例化、初始化(调用 init() ),然后服务
从第二次情况开始,每一次都是服务(调用 service() ),只有第一次访问会初始化
当容器关闭时,其中所有的servlet实例会被销毁,调用销毁方法(调用 destroy() )
servlet-name相同的Servlet实例Tomcat只会创建一个,所有url-pattern传入的请求都有这一个实例响应
- 优点:系统启动时不进行初始化,提高系统的启动速度
- 缺点:第一次请求时,需要初始化,响应时间较长
- 如果需要提高响应速度,需要设置Servlet初始化时机
Servlet初始化时机
- 默认在第一次接受请求时,实例化,初始化
- 在web.xml配置文件中,Servlet 下添加 load-on-startup 设置servlet启动先后顺序
- <load-on-startup 1 /load-on-startup> -> 启动过程中进行实例化、初始化
- 提高第一次请求的速度
Servlet在容器中是:单例的、线程不安全的
- 单例:所有请求都是同一个实例去响应
- 线程不安全:一个线程需要根据这个实例中的某个成员变量值去做逻辑判断,但这个成员变量又可能被另一个线程更改,从而导致第一个线程的执行路径发生变化
- 尽量不要在Servlet中定义成员变量。如果定义了成员变量,则1不要修改成员变量的值,2不要根据成员变量的值进行逻辑判断