实例化Bean之后,就是对Bean的属性进行注入的过程。
// 处理当前实例的依赖数据,依赖注入在这一步完成
populateBean(beanName, mbd, instanceWrapper);
具体代码分析
postProcessAfterInstantiation()方法,可以决定是否进行属性填充,只要有一个返回了false,都会终止属性填充的过程。
//mbd.isSynthetic() 合成类
//todo 第五次---判断属性是否填充:InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
// 给InstantiationAwareBeanPostProcessor最后一次机会在属性设置前来改变bean
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
continueWithPropertyPopulation = false;
break;
}
}
}
}
自动装配:autowiring自动装配,根据ByName或者ByType。提取依赖的bean,并统一存入到 propertyValues 中。
2. 自动装配 :autowiring自动装配的。根据名称或类型自动注入
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
// Add property values based on autowire by name if applicable.
//根据Bean名称进行autowiring自动装配处理
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}
// Add property values based on autowire by type if applicable.
//根据Bean类型进行autowiring自动装配处理
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
pvs = newPvs;
}
@Autowired 和 @Resource 的注入工作主要是通过
filterPropertyDescriptorsForDependencyCheck()方法
PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
if (hasInstAwareBpps) {
//TODO 获取的bean所有后置处理器找到 所有需要注入的属性
// 这里会进行 @Autowired 和 @Resource 的注入工作
// 属性填充InstantiationAwareBeanPostProcessor
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
//下面是完成属性注入的
pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
// 如果postProcessProperties 返回null,再调用 postProcessPropertyValues这个过时的方法
if (pvs == null) {
return;
}
}
}
}