上篇文章讲到
创建完对象完毕之后,就要对类的属性进行注入了,这就是属性注入
代码示例
@Component
public class BeanA {
@Autowired
private BeanB beanB;
}
@Component
public class BeanB {
}
我们以最简单的例子来观察源码,是怎么注入的
入口
在创建完毕对象后,即刻就要对对象进行属性注入
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
//依赖注入过程,@Autowired的支持 属性对,bean的实例对象,beanName
PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
if (filteredPds == null) {
filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
}
//老版本用这个完成依赖注入过程,@Autowired的支持
pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
return;
}
}
pvs = pvsToUse;
}
}
- 搞一个条件断点
断点之后发现有很多个实现,我们直接从字面意思去看org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessProperties
- 我们直接来到实现的代码
- 走过这行代码后,这个metaData的属性栏里面多了一个member需要注入的
- 这个时spring只要拿着这个对象的类型或者名称去容器里面去找就可以了
就相当于进行一次getBean操作了,这也是spring为什么会有循环依赖问题的原因,bean完全创建完成,触发依赖对象的创建,依赖对象可能还有依赖对象,这样就容易造成循环依赖问题了