【Spring源码系列- IOC】
进入populateBean()
对bean的属性进行填充,将各个属性值注入(存在其他bean的属性,则会递归初始化依赖的bean)
![](https://i-blog.csdnimg.cn/blog_migrate/aa53db6b3ea3ac6b48e047eeda7cc500.png)
一开始会先对传入的参数进行判断(如下图红框框中的逻辑)
![](https://i-blog.csdnimg.cn/blog_migrate/d2750905495ed86ca034397fd2f4da44.png)
如果传入的BeanWrapper和RootBeanDefinition的propertyValues属性都为空,则表示无可填充的属性,直接结束方法;
如果传入的BeanWrapper为空但是RootBeanDefinition的propertyValues属性不为空,则会抛出BeanCreationException(mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance")的异常;
只有在传入的BeanWrapper不为空才会进入到后面的逻辑
一般只要经历了前面的创建过程,这个位置传入的BeanWrapper就不会为空
有咩有客官觉得if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors())这个判断很熟悉( ̄∇ ̄)
前面介绍过的resolveBeforeInstantiation()这个方法中就有类似的代码(这个方法是应用实例化前的前置处理器,给BeanPostProcessors一个机会来返回代理代替真正的实例)
对resolveBeforeInstantiation()这个方法感兴趣的客官欢迎移步
【保姆级·创建对象】如何利用resolveBeforeInstantiation()在预处理阶段返回一个Bean的实例对象
![](https://i-blog.csdnimg.cn/blog_migrate/295811275895540e8b3d5e5039d01119.png)
回到我们的populateBean()
支持拓展的赋值方式(postProcessAfterInstantiation())
![](https://i-blog.csdnimg.cn/blog_migrate/4946b1d07d848ecfbebd8a433208589e.png)
这部分给任何实现了InstantiationAwareBeanPostProcessors的子类机会去修改bean的状态,在设置属性之前,可以被用来支持类型的字段注入,这部分包含两个判断:
!mbd.isSynthetic()是对属性synthetic 进行的判断,一般只有AOP相关的pointCut配置或者Advice配置才会将synthetic(合成的)设置为true
hasInstantiationAwareBeanPostProcessors()是判断是否有实现了InstantiationAwareBeanPostProcessors的子类
同时满足两个条件(传入的mbd不是synthetic且有实现了InstantiationAwareBeanPostProcessors的子类)会执行ibp.postProcessAfterInstantiation()方法
![](https://i-blog.csdnimg.cn/blog_migrate/498a8a54da42494bf028923981b65d3a.png)
这个方法默认返回true(它有几个实现类,感兴趣的可以都点进去看下,都是返回的true,当然你也可以自定义一个类来实现InstantiationAwareBeanPostProcessor返回个false直接终止后续的赋值操作)
![](https://i-blog.csdnimg.cn/blog_migrate/7271341e67037913a5652d149b9bccce.png)
接着获取beanDefinition中property属性(需要手动定义,默认是🈳,PropertyValues是包含一个或者多个PropertyValue对象的容器)
![](https://i-blog.csdnimg.cn/blog_migrate/576b0e40200363dba356660c0f5091db.png)
判断自动装配模式(autowireByName()/autowireByType())
![](https://i-blog.csdnimg.cn/blog_migrate/8eda7149e3fdafc01df4789378d8ec9e.png)
先获取mbd的自动装配模式,然后再判断mbd的自动装配模式(这里判断了两种模式):
AUTOWIRE_BY_NAME 根据名称自动注入
AUTOWIRE_BY_TYPE 根据类型自动注入
还有其他的,具体如下图
![](https://i-blog.csdnimg.cn/blog_migrate/8368a21fb4b8dc6c20cfa689e9d07f19.png)
想详细了解autowireByName()和autowireByType()这两个方法的客官可以蹲下,后面会详细介绍
此时newPvs已经包含了pvs的属性值以及通过AUTOWIRE_BY_NAME/AUTOWIRE_BY_TYPE两种自动装配模式所得到的属性值(其实就是根据自动装配模式进行了分类,后面才会进行注入),将其赋值给pvs
完成对象/属性的注入(postProcessProperties())
接下来定义了hasInstAwareBpps和needsDepCheck这两个布尔值分别用于判断工厂是否拥有InstantiationAwareBeanPostProcessor后处理器,以及判断是否需要依赖检查(默认AbstractBeanDefinition.DEPENDENCY_CHECK_NONE不检查),后面会分别对这两个值进行判断
当hasInstAwareBpps为true时,即工厂有InstantiationAwareBeanPostProcessor,那么就遍历工厂所有的后置处理器
![](https://i-blog.csdnimg.cn/blog_migrate/ad144115d7b62a9f4acaf3c87215fd53.png)
解析对象中定义的@Autowired注解,并通过调用这些后置处理器的postProcessProperties()方法,完成对象/属性的注入
![](https://i-blog.csdnimg.cn/blog_migrate/efd98ad2d043d18125ea4b7faf1c648b.png)
当needsDepCheck为true时,会进行行依赖检查,判断filteredPds是否为空,如果为空会对其进行赋值,最终通过调用checkDependencies()检查pd的setter()方法需要赋值时,pvs中有没有满足pd需求的属性值可供其赋值
![](https://i-blog.csdnimg.cn/blog_migrate/00707ec11946a60e1f74c8847af1b368.png)
属性值的解析和赋值(applyPropertyValues())
通过property标签定义的属性值完成各种属性值的解析和赋值
![](https://i-blog.csdnimg.cn/blog_migrate/4f6bab7ab4f61d4dc048f03045bc8a32.png)
至此方法populateBean()执行结束,撒个花吧嘿嘿(。・ω・。)ノ🎉