Loading

02Spring DI时序图分析

DI部分:

几个关键的API:
1、IOC容器
BeanFactory getBean()
AbstractBeanFactory

2、实例化策略
SimpleInstantiationStrategy
该类中进行Jdk或Cglib代理的选择!

3、存储实例所有相关的信息scope、proxy、instance
BeanWrapper,统一一个对外访问的入口!还可以扩展一些功能,缓存一些配置信息在Wrapper中!

 

DI是从getBean()开始的!因为Spring默认是Lazy加载bean!

实例化时的两种情况:
1、目标类配置了AOP,实例化代理类!
2、目标类没有配置AOP,实例化原生对象!


由populateBean()发起依赖注入!
由instantiateBean()发起实例化对象!

 

源码中IOC中几种bean的存储位置:

1、DefaultListableBeanFactory -> Map<String, BeanDefinition> beanDefinitionMap
用来存BeanDefinition!存bean的配置信息!


2、FactoryBeanRegistrySupport -> Map<String, Object> factoryBeanObjectCache
用来存原生单例bean!反射创建出的原生实例!

3、AbstractAutowireCapableBeanFactory -> Map<String, BeanWrapper> factoryBeanInstanceCache
用来存BeanWrapper!存包装后的成品bean!


小结:
DI从getBean函数触发,大体流程为:

getBean() ->

doGetBean() ->

doCreateBean() ->

createBeanInstance() 反射创建实例并封装为BeanWrapper ->

populateBean() 根据beanName、beanDefinition、BeanWrapper找到需要赋值的属性,把需要赋值的属性封装成一个集合,集合的元素为PropertyValue;PropertyValue中保存了需要赋值的bean、赋值需要调用的方法和需要赋的值 ->

applyPropretyValues() 循环pv,挨个调用BeanWrapper的setValue方法,用反射调用setter完成赋值!

 

主要流程:

寻找入口 -> 开始实例化 -> 选择实例化策略 -> 执行实例化 -> 准备依赖注入 -> 解析注入规则 -> 注入赋值

 

 

时序图:

 

posted @ 2020-09-08 00:49  yanbubao  阅读(55)  评论(0编辑  收藏  举报