此篇是补充上篇未分析完的finishBeanFactoryInitialization部分
配合上篇食用效果更佳缓存
Spring启动过程——源码分析bash
getBean进入doGetBean 下面四张图都是
doGetBean.1 app
//先从缓存中取 第一次进来时没有值的
Object singletonObject = this.singletonObjects.get(beanName);
//存在 则return
if(singletonObject!=null) return;
//解决循环依赖
beforeSingletonCreation(beanName);
//真正建立bean
singletonObject = singletonFactory.getObject();
afterSingletonCreation(beanName);
//加入缓存
addSingleton(beanName, singletonObject);
return singleObject
复制代码
真正建立Bean是createBean() 若是是bean是多例源码分析
//this.prototypesCurrentlyInCreation.set(beanName)
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
//this.prototypesCurrentlyInCreation.remove()
afterPrototypeCreation(beanName);
复制代码
单例多例建立Bean都会调用到createBean post
//通常用于建立aop代理
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
//若是上边没有代理 这里会真正开始建立
Object beanInstance = doCreateBean(beanName, mbdToUse, args)
复制代码
createBean->resolveBeforeInstantiation ui
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)
bp instanceof MergedBeanDefinitionPostProcessor -> bp.postProcessMergedBeanDefinition(mbd, beanType, beanName)this
为刚刚实例化好的Bean进行属性等赋值google
BeanWrapper为null直接报错或者returnspa
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
官方的解释是:让用户能够自定义属性注入。好比用户实现一 个 InstantiationAwareBeanPostProcessor 类型的后置处理器,并经过 postProcessAfterInstantiation 方法向 bean 的成员变量注入自定义的信息。固然,若是无 特殊需求,直接使用配置中的信息注入便可。另外,Spring 并不建议你们直接实现 InstantiationAwareBeanPostProcessor 接口,若是想实现这种类型的后置处理器,更建议 经过继承 InstantiationAwareBeanPostProcessorAdapter 抽象类实现自定义后置处理器prototype
Field field = (Field) this.member;
ReflectionUtils.makeAccessible(field);
field.set(bean, value);
复制代码
applyPropertyValues(beanName, mbd, bw, pvs);
将属性应用到 bean 对象中
检测属性值列表是否已转换过的,若转换过,则直接填充属性,无需再次转换
遍历属性值列表 pvs,解析原始值 originalValue,获得解析值 resolvedValue
对解析后的属性值 resolvedValue 进行类型转换
将类型转换后的属性值设置到 PropertyValue 对象中,并将 PropertyValue 对象存入 deepCopy 集合中
将 deepCopy 中的属性信息注入到 bean 对象中
流程图:
余下的初始化工做
invokeInitMethods(beanName, wrappedBean, mbd)
FactoryBean一直都没怎么用过 因此本身写了demo用下
@Autowired
private Student2 student2;
复制代码
debug一下 查看下执行过程
此次Spring ioc源码看了我好几天,收获仍是挺大的,也总结
最后关于Spring总结 主要按着下面四点去看 1)、Spring容器在启动,先保存Bean定义信息
2)、Spring容器会在XX的状况下建立Bean
3)、后置处理器 *每个Bean建立完成 会使用处理器处理
4)、事件驱动模型 *ApplicationListener 事件监听 *ApplicationEventMulticaster 事件派发