Bean的生命周期

概要流程

单例对象:singleton

  • 生命周期与容器相同

多例对象:prototype

  • 出生:对象时spring框架为我们创建
  • 活着:使用过程
  • 死亡:被gc回收

Bean 的生命周期概括起来就是 4 个阶段:

  1. 实例化(Instantiation):new一个对象
  2. 属性赋值(Populate):设置对象属性和依赖,也就是IoC注入:按照Spring上下文对实例化的Bean配置
  3. 初始化(Initialization):有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作
  4. 销毁(Destruction):有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁

img

扩展点的作用

Aware

Aware接口:若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源

Spring 中提供的 Aware 接口有:

  • BeanNameAware:注入当前 bean 对应 beanName
  • BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader
  • BeanFactoryAware:注入 当前BeanFactory容器 的引用

BeanPostProcessor

  • 对于标记接口的实现类,进行自定义处理。例如ApplicationContextAwareProcessor,为其注入相应依赖;再举个例子,自定义对实现解密接口的类,将对其属性进行解密处理
  • 为当前对象提供代理实现。例如 Spring AOP 功能,生成对象的代理类,然后返回

InitializingBean 和 init-method

InitializingBean接口实现了afterPropertiesSet()方法,afterPropertiesSet()方法里可以书写初始化逻辑

可以在配置文件中指定 init-method 方法,指定初始化方法

DisposableBean 和 destory-method 与上述类似,就不描述了

IoC的实现原理

  • 扫描和解析配置文件或注解信息,讲其转换为内部的对象定义和依赖关系
  • 根据对象的定义和依赖关系,使用反射机制动态创建和初始化对象,并将对象注入到需要用他们的地方
  • 具体来说,对应着Bean的前3个大阶段