spring内幕(八)bean的初始化之populateBean()方法

本文详细解析了Spring框架中AbstractAutowireCapableBeanFactory的populateBean()方法,涉及byName和byType两种自动装配方式的区别。当使用@Autowired注解时,Spring默认采用byType策略,若存在多个相同类型的Bean,则需借助@Qualifier指定bean名称。在bean初始化过程中,通过BeanFactoryUtils获取匹配的Bean,并利用BeanWrapper的setPropertyValues方法进行属性注入,对于无set方法的注解注入,Spring会通过反射直接修改私有属性。

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

1.先从beanDefinition中取得设置的property值

2.执行autowireByName方法 (根据bean的名字注入)
或者 autowireByType方法 (根据bean的类型注入)

举例:
byType
在这里插入图片描述
byname
在这里插入图片描述

区别就是 byName,bean的id要和需要注入的bean里面的类成员变量名称一致,byType则不需要,但是如果存在两个相同类型,就会报错。

注意!以上是在xml里面对bean进行配置的时候设置的autowire属性 ,不是@Autowire注解

@Autowired是spring的注解,默认使用的是byType的方式向Bean里面注入相应的Bean

因此,如果我们@Autowired 一个接口,那么就会在ioc容器里面找到这个接口的实现类的bean 进行注入,但是如果有两个实现类 ,因为byType就无法确定是哪一个,那就会报错了。

通过@Qualifier注解来指明使用哪一个实现类,实际上是通过byName的方式实现,指定了bean的名字。

autowireByName
先根据beanName 获取到该bean的要注入的属性名称数组
然后遍历属性名称数组 用属性名称挨个去ioc容器中获取bean
放到依赖缓存集合中

autowireByType
根据bean的类型,

最终从
BeanFactoryUtils.beanNamesForTypeIncludingAncestors方法中 获取到需要符合类型的所有bean。

org.springframework.beans.factory.BeanFactoryUtils
#beanNamesForTypeIncludingAncestors(org.springframework.beans.factory.ListableBeanFactory, java.lang.Class<?>, boolean, boolean)
放到依赖缓存集合中

然后在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyPropertyValues方法中

将对应的beanDefinition转换为Bean
(这里会对PropertyValues的属性列表进行一份深拷贝,因为后面会用到将这个属性列表里面的beanDefinition转换为bean)

使用的是BeanDefinitionValueResolver来对beanDefinition进行解析
在这里插入图片描述

解析一个引用为一个bean 会去容器中找,又会触发getBean
在这里插入图片描述

除此之外,还有其他类型的解析
在这里插入图片描述

拿到bean之后,最后调用BeanWrapper的setPropertyValues方法进行注入
不同的属性类型 调用不同的注入方法。
在这里插入图片描述

最终是获取到注入属性的set方法,通过反射机制,把对象注入进去
在这里插入图片描述

writeMethodName如下
在这里插入图片描述

在这里插入图片描述

因此 xml形式的bean配置 使用了set注入的话 是需要有set方法的。

但是通过注解@Autowire 就不需要set方法,spring会通过属性注入值,对私有属性暴力反射访问 修改权限 直接赋值。
比如说所如下
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值