web 应用中 Servlet 只实例化一次,支持多线程是因为其service()方法可以被多次调用。
servlet 的生命周期为:
(1)实例化
- 默认情况下,servlet在web容器初始化时实例化,调用其init()方法
- 修改其初始化参数,使其在请求到来的时候实例化:此时,会先检查容器中是否存在servlet实例,如果没有,就实例化一个出来;如果有就使用这个实例
(2)调用doXXX()方法
- 根据表单的method=post/get ,调用其doPost()/doGet()方法,处理请求和相应数据
(3)销毁
- 当web容器准备销毁servlet实例时,调用其destory()方法
当有不同的用户对同一个web应用发出请求时,每一个用户都会创建一个servlet实例,但是web容器在维护时,只允许有一个servlet实例存l在JVM中。
我自己理解就是:其实,每一个用户都有对应的servlet实例,但是在使用web应用时,某一个时刻只允许一个servlet实例起作用!
而对于同一个用户,就只有一个servlet实例,并且采取多线程的方式运行其service()方法,处理多请求。
Servlet并不是单例,只是容器让它只实例化一次,变现出来的是单例的效果而已。
Servlet是web容器来控制实例化的,并不是你自己用你编写的代码来实例化,即使你自己编写代码实例化你的servlet,Web服务器也不会直接调用你的实例化的Servlet对象的。