image.png

Spring 中 Bean 的生命周期

① 实例化 Bean:对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 Bean 时,或初始化 Bean 的时候需要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化。对于 ApplicationContext容器,当容器启动结束后,通过获取 BeanDefinition 对象中的信息,实例化所有的 Bean;
② 设置对象属性(依赖注入):实例化后的对象被封装在 BeanWrapper对象中,紧接着 Spring 根据 BeanDefinition 中的信息以及通过BeanWrapper 提供的设置属性的接口完成依赖注入;
③ 处理 Aware 接口:Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean:
• 如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的setBeanName(String BeanId) 方法,此处传递的就是 Spring 配置文件中Bean 的 id 值;
• 如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的setBeanFactory() 方法,传递的是 Spring 工厂自身;
• 如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用setApplicationContext(ApplicationContext) 方法,传入 Spring 上下文;
④ BeanPostProcessor:如果想对 Bean 进行一些自定义的处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,那将会调用postProcessBeforeInitialization(Object obj, String s) 方法;
⑤ InitializingBean 与 init-method:如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法;
⑥ 如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用postProcessAfterInitialization(Object obj, String s) 方法;由于这个方法是在 Bean 初始化结束时调用的,因而可以被应用于内存或缓存技术;以上几个步骤完成后,Bean 就已经被正确创建了,之后就可以使用这个 Bean了。
⑦ DisposableBean:当 Bean 不再需要时,会经过清理阶段,如果 Bean实现了 DisposableBean 这个接口,会调用其实现的 destroy() 方法;
⑧ destroy-method:最后,如果这个 Bean 的 Spring 配置中配置了destroy-method 属性,会自动调用其配置的销毁方法。

描述方式

  1. 实例化bean:反射的方式生成对象
  2. 填充bean的属性:populateBean(), 循环依赖的问题(三级缓存)
  3. 调用aware接口相关方法:invokeAwareMethod(完成BeanName,BeanFactory,BeanClassloader对象属性设置)
  4. 调用BeanPostProcessor中的前置方法:使用比较多的有(ApplicationContentextPostProcessor,设置ApplicationContext,Environment,ResourceLoader,EnbeddValueResolver等等)
  5. 调用initmethod方法:invokeinitmethod(),判断是否实现了InitializingBean接口,如果有调用afterPropertiesSet方法
  6. 调用BeanPostProcessor的后置方法:spring的aop就是在此处理实现的,AbstractAutoProxyCreator
    1. 注册Destruction相关的回调接口
  7. 获取完整的bean对象,可以通过genBean的方式获取
  8. 销毁流程
    1. 判断是否实现DisposableBean接口
    2. 调用destroyMethod方法