吃透Spring源码(十一):Spring属性填充populateBean源码分析
一,属性填充分类
Spring实例化前面我们已经分析过了,实例化之后,紧接着就是对属性进行填充了,属性填充主要是对自动注入(autowired) 的处理,我们大致可以把他分为三类:
1、 autowireByName:通过名字对属性填充;
2、 autowireByType:通过类型对属性填充;
3、 @Autowired:通过bean的后置处理器AutowiredAnnotationBeanPostProcessor对@Autowired注解属性填充;
我们来看一下具体源码:
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
// 省略部分代码.......
// 获取 mbd 的 自动装配模式
int resolvedAutowireMode = mbd.getResolvedAutowireMode();
// 如果 自动装配模式 为 按名称自动装配bean属性 或者 按类型自动装配bean属性
if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
/**
* 1,根据属性名进行注入
*/
if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
//通过bw的PropertyDescriptor属性名,查找出对应的Bean对象,将其添加到newPvs中
autowireByName(beanName, mbd, bw, newPvs);
}
/**
* 2,根据属性类型进行注入
*/
if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
//通过bw的PropertyDescriptor属性类型,查找出对应的Bean对象,将其添加到newPvs中
autowireByType(beanName, mbd, bw, newPvs);
}
}
/**
* 3,通过遍历到AutowiredAnnotationBeanPostProcessor执行postProcessProperties()方法
* 来实现对@Autowired注解进行注入
*/
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
}
}
}
// 上面只是把属性所对应得object保存到pvs中,并没有给属性赋值
// 这里会调用类得set方法给属性赋值
if (pvs != null) {
//应用给定的属性值,解决任何在这个bean工厂运行时其他bean的引用。必须使用深拷贝,所以我们 不会永久地修改这个属性
applyPropertyValues(beanName, mbd, bw, pvs);
}
// 省略部分代码...
}