Spring -- 依赖注入源码分析

来源:互联网 发布:c语言 extern static 编辑:程序博客网 时间:2024/04/28 10:44

阅读这篇博客,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框架,在这里打个断点
这里写图片描述

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

org.springframework.context.annotation.internalConfigurationAnnotationProcessor

进一步断点执行到,

beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);

getInstantiationStrategy()方法获取到的是CglibSubclassingInstantiationStrategy();类
CglibSubclassingInstantiationStrategy继承SimpleInstantiationStrategy
调用父类SimpleInstantiationStrategy中的instantiate方法。
这里写图片描述
如上图代码执行到BeanUtils.instantiateClass(constructorToUse),bean实例化的核心
这里写图片描述
到此完成了bean的实例化过程。

populateBean(beanName, mbd, instanceWrapper);

下面来分析是如何进行依赖注入的。
在populateBean方法找到1226行applyPropertyValues(beanName, mbd, bw, pvs);代码
这里写图片描述

看上图,
dataSource这个bean,propertyValues对象中承载着12个属性,图中箭头。

跳转到1514行bw.setPropertyValues(new MutablePropertyValues(deepCopy));
此行代码引入的deepCopy,如下图

这里写图片描述

这里写图片描述

看看上图我们熟悉的配置,大概你你就清楚之前2块代码了。

到此,我们了解了,spring将配置文件中我们表明要注入的Bean获取,并且获取到目标bean中的所有属性值。
然后调用bw.setPropertyValues。

来看下bw.setPropertyValues,BeanWrapper是一个接口,默认实现类BeanWrapperImpl,它的继承体系如下
这里写图片描述

setPropertyValues方法在AbstractPropertyAccessor类中实现。

这里写图片描述

上图遍历Bean中所有的属性。
运行到AbstractNestablePropertyAccessor类中的setPropertyValue方法
最终将属性对应的值存入到此类454行ph.setValue(this.wrappedObject, valueToApply);中,PropertyHandler是一个抽象类setValue方法在模板方法中实现

这里写图片描述

实际运行的是BeanPropertyHandler类中的setValue方法

这里写图片描述

可以看到通过反射的方式,运行目标方法。完成了最终的属性注入

0 0
原创粉丝点击