一 、Spring中Bean的生命周期
(一)一个springbean的生命周期总体来说五个阶段:
实例化 --> 属性填充 --> 初始化 --> 生存期–> 销毁
1.首先讲讲实例化Bean,客户端在请求一个尚未初始换的bean,容器会调用doCreateBean方法,用射的方式创建实例化一个bean。
2.实例化之后会进行属性填充,可以注入这个Bean依赖的其他的Bean
3.初始化操作有几个步骤进行处理:
(1)执行Aware接口
Spring会检测是否实现了XXaware接口,如BeanNameAware获取BeanName,实现BeanFactoryAware获取BeanFactory等
(2)执行BeanPostProcessor的前置处理方法,进行一些Bean的前置处理
(3)判断Bean是否实现了InitializingBean接口,如若实现, 则执行initailizingBean的afterPropertiesSet()初始化方法。
(4)执行用户自定义初始化方法
(5)执行BeanPostProcessor的后置处理方法,进行postProcessAfterinitialization
4.初始化完成则Bean创建完成可以正常使用。
5.当Bean经过垃圾回收等等处理无用之后,进行销毁操作。
(1) 首先判断Bean是否实现了DestructionAwareBeanPostProcessor接口,如果实现了,则会执行DestructionAwareBeanPostProcessor后置处理器的销毁回调方法
(2) 其次会判断Bean是否实现了DisposableBean接口,如果实现了将会调用其实现的destroy()方法
(3) 最后判断这个Bean是否配置了dlestroy-method等自定义的销毁方法,如果有的话,则会自动调用其配置的销毁方法;
了解以上有什么好处,可以对一些Bean初始化进行性能增强。
二、 线程的生命周期
(一) 一个线程的生命周期有五个阶段
创建 --> 就绪 --> 运行 --> 阻塞 --> 死亡
(1)创建就是线程对象进行初始化,在Java虚拟机中分配内存,注意此时线程仅是个对象。
(2)就绪是线程调用start方法后,线程处于等待cpu分配资源运行的状态,当进入就绪状态,Java虚拟机中会为其创建 方法调用栈和程序计数器,线程在Java虚拟机中运行。
(3) 运行就是当就绪的线程获得了cpu的资源时候,进入了运行状态,开始启用run方法。当就绪的线程获得了cpu资源分配,就会执行run方法。
当一个单核cpu只能同时执行一条命令,JVM中通过快速切换线程执行指令来达到多线程,这种切换的速度很快,一般感知不到,也就是并发的原理。为了切换不同线程还可以恢复正确的执行位置,需要用到独立程序计数器保证线程之间独立不受影响。
当一个线程在运行后,不能一直占有cpu,需要在执行中中断,保证其他线程也能获取到执行cpu的机会,具体的线程调度细节还是取决于底层平台的策略。
(4) 阻塞就是在线程运行状态中会因为不同原因变成阻塞状态
1.等待I/O流的输入输出
2.等待网络资源,即网速问题
3.调用sleep()方法,需要等sleep时间结束
4.调用wait()方法,需要调用notify()唤醒线程
5.其他线程执行join()方法,当前线程则会阻塞,需要等其他线程执行完。
(5) 死亡
1.run()或者call()方法执行完成,线程正常结束。
2.线程抛出未捕获的异常Exception或者Error
直接调用stop()方法,容易死锁,不用。
三、Servlet的生命周期
简述Servlet三个阶段
初始化–> 运行时 --> 销毁
在servlet接口中,有三个方法
init方法:负责初始化Servlet对象。在servlet容器初始化时调用。
service方法:负责响应客户的请求。
destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。