完整的bean生命周期
实例化
实例化就是在堆中分配内存并设置默认值,通过createBeanInstance方法中的反射机制来实现
- • 第一步获取bean的class对象
- • 第二步获取构造器
- • 第三步使用newInstance来生成对象
反射的效率不是很低么,为什么要用反射
通过反射机制一次性实例化超过10万个对象的效率会很低,若没有那么多对象,则不用担心效率问题。
初始化
实例化的下一步就是初始化,初始化的第一步就是设置属性,设置属性的方法是populateBean,调用set方法赋值。
检查Aware相关依赖并设置对应属性
举例说明
定义一个Dog类
容器对象比如BeanFactory、ApplicationContext、Environment、ResourceLoader。
那如何给容器对象初始化?
通过实现容器对象对应的Aware接口,重写对应的set方法即可完成这些容器对象的初始化操作
当上述方法调用完之后,此对象可以直接拿来使用。
接下来通过BeanPostProcessor的前置和后置方法对bean对象进行扩展
AOP
AOP底层实现原理是动态代理,动态代理的2种实现方式:jdk和cglib。
假设一个对象就需要被创建动态代理对象,那意味着在中间某个步骤会生成代理对象。
这里就需要用到AbstractAutoProxyCreator抽象类,这个类是BeanPostProcess子类
重写了前置和后置方法。
源码跟踪进去,在AopProxy接口中就会发现动态代理的这两种实现方式。
BeanFactory和FactoryBean区别
BeanFactory和FactoryBean都是为了创建对象用的。
- • BeanFactory必须遵循完整的bean的生命周期去创建对象,该过程很复杂,流水线的方式。
- • FactoryBean创建对象没有一个标准的流程,私人定制的方式。
FactoryBean中有3个方法
- • isSingletokn 判断是否是单例
- • getObjectType 返回对象类型
- • getObject 返回对象