MyTestBean bean=(MyTestBean) bf.getBean(“meTestBean”);
getBean方法的doGetBean
方法里包含:
1.存在缓存
(1)getSingleton方法:缓存中获取单例bean
SingletonObjects:一级缓存,先从此中获取实例
earlySingletonObjects:二级缓存,如果一级缓存获取不到实例,再从此种获取实例
singletonFactories:三级缓存,如果二级缓存获取不到实例,再从此种获取实例
(2)getObjectForBeanInstance方法:从bean的实例中获取对象
对FactoryBean正确性的验证。
对非FactoryBean不做任何处理。
对bean进行转换。
将从Factory中解析bean的工作委托给GetObjectFromFactoryBean.
GetObjectFromFactoryBean:返回的bean如果是单例的,那就必须要保证全局唯一,同时因为是单例的,所以不必重复创建,可以使用缓存来提高性能。
doGetObjectFromFactoryBean方法:
factory.getObject();
postProcessObjectFromFactoryBean
2.无缓存:
(1)getSingleton方法:检查缓存是否已经加载过,若没有加载,则记录beanName的正在加载状态。
beforeSingletonCreation:加载单例前记录加载状态.
singletonFactory.getObject();:实例化bean
afterSingletonCreation:加载单例后处理方法调用,即移除缓存中对该bean正在加载状态的记录。
addSingleton:将结果记录至缓存并删除加载bean过程中所记录的各种辅助状态。
3.准备创建bean
CreateBean方法:
resolveBeanClass:根据设置的class属性或者根据className来解析Class.
mbd.prepareMethodOverrides:验证及准备覆盖的方法。对Override属性进行标记及验证。
resolveBeforeInstantiation:给beanProcessors一个机会来返回代理来替代真正的实例。应用初始化前的后处理器,解析指定bean是否存在初始化前的短路操作。
docreateBean:创建bean
循环依赖
4.创建bean
docreateBean方法:
(1)createBeanInstance方法:
AutowireConstructor:带参数构造函数实例化
instantiateBean:不带参数构造函数实例化
循环依赖检查。
(2)populateBean方法:
InstantiationAwareBeanPostProcessor处理器的postProcessAfterInstantiation函数的应用,此函数可以控制程序是否继续进行属性填充。
autowireByName:属性注入(根据名称自动注入)
autowireByType:属性注入(根据类型自动注入)
InstantiationAwareBeanPostProcessor处理器的postProcessPropertyValues方法,对属性获取完毕填充前对属性的再次处理。
ApplyPropertyValues:将所有propertyValues中的属性填充至BeanWrapper.
(3)initializeBean:调用用户设置的初始化方法。
(4)registerDisposableBeanIfNecessary:注册后处理器来统一处理bean的销毁方法。