一、Bean的生命周期
生命周期:Bean对象的创建、使用和销毁过程;
1. 实例化
- 创建对象 createBeanInstance ()
在堆空间中申请空间,此时对象的属性值一般是默认值
反射创建对象的过程:
createBeanInstance -> 获取clazz对象 -> 获取构造器 -> 实例化创建对象ctor.newInstance(argsWithDefaultValues);
2. 属性赋值
- 自定义属性 赋值 populateBean()
populateBean()调用set()方法完成属性赋值
- 容器对象 属性赋值 Aware接口
Aware接口类似于Serializable接口
检查Aware相关接口并设置依赖;
invokeAwareMethods()方法回调Aware接口中的方法来完成属性值的注入
执行完属性赋值后,对象的创建和属性赋值已经完成,理论上对象此时可以直接拿来使用。但基于扩展性的考虑,Spring方法还需要进行初始化
3. 初始化(Bean对象的扩展实现)
- BeanPostProcessor 接口含有两个方法实现前置处理与后置处理:
前置处理方法 :postProcessBeforeInitialization
后置处理方法:postProcessAfterInitialization
- BeanPostProcessor AOP 底层实现动态代理(jdk、cglib)
BeanPostProcessor 接口 -> AbstractAutoProxyCreator抽象类 -> postProcessAfterInitialization方法 -> wrapIfNecessary 方法 -> createProxy()方法 -> ProxyFactory代理工厂实现AOP代理
注意:AOP是IOC整体流程中的一个扩展点
- invokeInitMethods 执行初始化方法
检测Bean是否实现了InitializingBean接口 -> 调用afterPropertiesSet()方法
- 执行顺序
执行前置处理方法 -> 执行初始化方法 -> 执行后置处理方法
4. 使用Bean对象
5. 销毁Bean对象
关闭容器的时候会销毁Bean对象
关闭容器:contex.close();