Spring 依赖注入(DI) 源码解析时序图
2021-03-16 10:57:21 112 举报
Spring 依赖注入(DI) 源码解析时序图
作者其他创作
大纲/内容
1
No
实际调用doGetBean()方法
如果没有
autowireByType()
2
三种注入方式流程,参见接下来的源码分析过程
1.Spring是通过递归的方式获取目标bean及其所依赖的bean的;2.Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。 结合这两点,也就是说,Spring在实例化一个bean的时候,是首先递归的实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。
Yes
返回 Bean 对象
此处是Spring解决Bean循环依赖阶段
如果没有循环依赖,则会去调用一个被重写getObject() 方法的getSingleton()方法,来创建Bean 实例
使用JDK的反射机制创建对象
创建过程代码附上
存在Bean循环依赖
2.调用 populateBean() 方法,对Bean属性的依赖注入进行处理
如果时序图对您有用,请在右上角给点个赞吧。5个赞我能多一张文件,支持作者继续画出更好的时序图给大家,谢谢大家支持配套博客介绍:请搜索CSDN 扛麻袋的少年
对未配置autowiring的属性进行依赖注入处理
invokeBeanFactoryPostProcessors()
否则使用默认的无参构造方法实例化
调用getSingleton()方法
完成一些基础的判断。诸如:1.Bean是否可实例化2.如果Bean配置了前置/后置处理器,则返回Bean的代理对象
autowireByName()
3
扛麻袋的少年 2020-03-11
getSingleton()
(使用委派模式,调用的是 AbstractAutowireCapableBeanFactory类中的 createBean()方法)
PostProcessorRegistrationDelegate
尝试通过bean名称获取【单例】的目标bean对象,多个Map之间查找,最后返回 FactoryBean类型的 Bean
DefaultSingletonBeanRegistry
判断 BeanDefinition 配置定义为单例模式/原型模式,都不是的话则根据配置的 scope 生命周期(request、session、application)来完成Bean的实例化。
创建 Bean 实例完成,开始对Bean 进行依赖注入操作
调用instantiate()方法,使用初始化策略实例化Bean对象
refresh()
创建Bean的入口!!
SimpleInstantiationStrategy
applyPropertyValues()
Spring解决Bean循环依赖的流程:
使用CgLib代理创建对象
doCreateBean()
Spring 依赖注入(DI) 源码解析时序图
AbstractAutowireCapableBeanFactory
getBean()
createBean()
instantiate()
如果:配置了自动装配autowire属性,使用容器的自动装配实例化容器的自动装配是根据参数类型匹配Bean的构造方法
AbstractBeanFactory
检查当前Bean有无继承关系
获取到当前Bean的定义最终调用createBean()方法来创建Bean对象
(即:将Bean的属性设置到生成的实例对象上)
对配置 autowiring=\"byName\"的,根据Bean名称进行自动装配
循环调用Bean对象中的依赖类直到某个Bean没有依赖其他Bean为止
对配置 autowiring=\"byType\"的,根据Bean类型进行自动装配
createBeanInstance()
(BeanDefinition类型)
Bean类之间是否有循环依赖
返回
比如说A类中引用了B对象,B类中引用了C对象...
AbstractApplicationContext
IOC容器是否注册该 Bean
populateBean()
instantiateBean()
0 条评论
回复 删除
下一页