Bean的生命周期以及IoC的实现原理
Bean的生命周期
概要流程
单例对象:singleton
- 生命周期与容器相同
多例对象:prototype
- 出生:对象时spring框架为我们创建
- 活着:使用过程
- 死亡:被gc回收
Bean 的生命周期概括起来就是 4 个阶段:
- 实例化(Instantiation):new一个对象
- 属性赋值(Populate):设置对象属性和依赖,也就是IoC注入:按照Spring上下文对实例化的Bean配置
- 初始化(Initialization):有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作
- 销毁(Destruction):有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁
扩展点的作用
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个大阶段
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 cloud_fly blog!