框架技术|Spring -- 依赖注入源码分析

阅读这篇博客,http://www.cnblogs.com/ITtangtang/p/3978349.html
下面我们直接抓住依赖代码的入口方法,整理代码的运行思路。
spring jar包版本4.2.6
核心代码:AbstractAutowireCapableBeanFactory.class
核心方法:503行代码 protected Object doCreateBean
其中2行主要的代码:
● 510行 instanceWrapper = createBeanInstance(beanName, mbd, args);
● 543行 populateBean(beanName, mbd, instanceWrapper);
instanceWrapper = createBeanInstance(beanName, mbd, args); 方法解析
进入方法createBeanInstance,此方法用于创建Bean的实例,我本地启动spring框架,在这里打个断点
框架技术|Spring -- 依赖注入源码分析
文章图片

上图的红框中的代码,可以看出正在实例化类

org.springframework.context.annotation.internalConfigurationAnnotationProcessor

进一步断点执行到,
beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);

getInstantiationStrategy()方法获取到的是CglibSubclassingInstantiationStrategy(); 类
CglibSubclassingInstantiationStrategy继承SimpleInstantiationStrategy
调用父类SimpleInstantiationStrategy中的instantiate方法。
框架技术|Spring -- 依赖注入源码分析
文章图片

如上图代码执行到BeanUtils.instantiateClass(constructorToUse),bean实例化的核心
框架技术|Spring -- 依赖注入源码分析
文章图片

到此完成了bean的实例化过程。
populateBean(beanName, mbd, instanceWrapper); 下面来分析是如何进行依赖注入的。
在populateBean方法找到1226行applyPropertyValues(beanName, mbd, bw, pvs); 代码
框架技术|Spring -- 依赖注入源码分析
文章图片

看上图,
dataSource这个bean,propertyValues对象中承载着12个属性,图中箭头。
跳转到1514行bw.setPropertyValues(new MutablePropertyValues(deepCopy));
此行代码引入的deepCopy,如下图
框架技术|Spring -- 依赖注入源码分析
文章图片

框架技术|Spring -- 依赖注入源码分析
文章图片

看看上图我们熟悉的配置,大概你你就清楚之前2块代码了。
到此,我们了解了,spring将配置文件中我们表明要注入的Bean获取,并且获取到目标bean中的所有属性值。
然后调用bw.setPropertyValues。
来看下bw.setPropertyValues,BeanWrapper是一个接口,默认实现类BeanWrapperImpl,它的继承体系如下
框架技术|Spring -- 依赖注入源码分析
文章图片

setPropertyValues方法在AbstractPropertyAccessor类中实现。
框架技术|Spring -- 依赖注入源码分析
文章图片

上图遍历Bean中所有的属性。
运行到AbstractNestablePropertyAccessor类中的setPropertyValue方法
最终将属性对应的值存入到此类454行ph.setValue(this.wrappedObject, valueToApply); 中,PropertyHandler是一个抽象类setValue方法在模板方法中实现
框架技术|Spring -- 依赖注入源码分析
文章图片

实际运行的是BeanPropertyHandler类中的setValue方法
框架技术|Spring -- 依赖注入源码分析
文章图片

【框架技术|Spring -- 依赖注入源码分析】可以看到通过反射的方式,运行目标方法。完成了最终的属性注入

    推荐阅读