原视频地址:https://www.bilibili.com/video/BV1vb41187jH?p=22
1. 什么是生命周期
生命周期表示一个JAVA对象从最初被创建到最终被消除,经历的所有过程
2. Servlet对象的生命周期是谁来管理的?程序员可以干涉吗?
- Servlet对象的生命周期,javaweb程序员是无权干涉的,包括该Servlet对象的相关方法的调用,javaweb程序员也是无权干涉的。
- Servlet对象从最初的创建,方法的调用,以及对象的销毁,整个过程是由WEB容器来管理的。
- WEB Container管理Servlet对象的生命周期。
3. Servlet对象的实例化
默认情况下,Servlet对象在WEB服务器启动阶段不会被实例化。【若希望在WEB服务器启动阶段实例化Servlet对象,需要在web.xml中进行配置】
4. 描述Servlet对象的生命周期
用户在浏览器地址栏上输入URL:http://localhost:8080/projectname/resource
web容器截取请求路径:/projectname/resource
web容器在容器上下文中找请求路径/projectname/resource
若没有找到对应的Servlet对象
【1】通过web.xml文件中相关的配置信息,得到请求路径/resource对应的Servlet完整类名
【2】通过反射机制,调用Servlet类的无参构造方法完成Servlet对象的实例化
【3】web容器调用Servlet对象的init方法完成初始化操作
【4】web容器调用Servlet对象的service方法提供服务若找到对应的Servlet对象
【1】web容器调用Servlet对象的service方法提供服务
web容器关闭的时候/webapp重新部署的时候/该Servlet对象长时间没有用户访问的时候,web容器会将该Servlet对象销毁,在销毁该对象之前,web容器会调用Servlet对象的destroy方法,完成销毁之前的准备。
5. 总结
- Servlet类的构造方法只执行一次
- Servlet对象的init方法只执行一次
- Servlet对象的service方法,只要用户请求一次,就执行一次
- Servlet对象的destroy方法,只执行一次
6. 注意
- init方法执行的时候,Servlet对象已经创建好了
- destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁
7. Servlet对象(伪)单例多线程
Servlet对象是单例的但是不符合单例模式,只能称为伪单例。真单例的构造方法是私有的。Tomcat服务器是支持多线程的,所以Servlet对象在单实例多线程的环境下运行。那么Servlet对象中若有实例变量,并且实例变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。
8.服务器启动时实例化Servlet对象
在web.xml文件中进行配置
1 | <servlet> |
注意:<load-on-startup>0</load-on-startup>
自然数越小优先级越高,越先被实例化
9. Servlet对象实例化之后,这个Servlet对象被存储到哪里了?
大多数的WEB容器都是将该Servlet对象以及对应的url-pattern存储到Map集合中了。
在WEB容器中有这样一个Map集合
Map<String, Servlet>
key value
/login loginServlet对象引用
/delete deleteServlet对象引用
/save saveServlet对象引用
10. 服务器在启动时就会解析各个webapp的web.xml文件
将web.xml文件中的url-pattern和对应的Servlet完整类名存储到Map集合中了
在WEB容器中有这样一个Map集合
Map<String, String>
key value
/login 包名.loginServlet
/delete 包名.deleteServlet
……
11.Servlet接口中的方法编写什么代码?什么时候使用这些方法?
- 无参数构造方法【以后就不需要再考虑构造函数了,尽量别动构造函数】
- init方法
以上两个方法执行时间几乎是相同的,执行次数都是一次,构造方法执行的时候对象正在创建,init方法执行的时候,对象已经创建;若系统要求在对象创建时刻执行一段特殊的代码,这段代码尽量写到init方法中。
为什么不建议将代码写到构造函数中:
- 存在风险。当程序员编写构造方法的时候,可能会导致无参数构造方法不存在
Servlet中的init方法是SUN公司为javaweb程序员专门提供的一个初始化时刻,若希望在初始化时刻执行一段特殊的代码,这段代码可以写到init中,将来会被自动调用。
- service方法
这个方法是必须要重写的。因为在这个方法需要完成业务逻辑的处理,请求的处理,以及完成响应。
destroy方法
这个方法也是sun公司为javaweb程序员提供的一个特殊的时候,这个特殊的时刻被称为对象销毁时刻。若希望在销毁时刻执行一段特殊的代码,需要将这段代码写到destroy方法,自动被容器调用。
回顾:类加载时刻执行程序,代码写到静态代码块中。