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方法
可以看到通过反射的方式,运行目标方法。完成了最终的属性注入
- Spring依赖注入源码分析
- Spring -- 依赖注入源码分析
- Spring -- 依赖注入源码分析(二)
- Spring源码分析----IOC依赖注入
- 深入研究Spring-IoC:源码分析依赖注入
- Spring源码解析 依赖注入
- Spring源码解析 依赖注入
- Spring源码解析 依赖注入
- struts2源码分析(依赖注入)
- Spring源码学习-4.IoC.依赖注入
- spring源码解读 Bean的依赖注入
- spring源码分析 循环依赖
- Spring源代码分析之依赖注入
- 深入分析JavaWeb Item51 -- Spring依赖注入
- 深入分析JavaWeb 51 -- Spring依赖注入
- Spring IOC依赖注入的过程分析
- 【Spring】Spring的IOC(控制反转)/DI(依赖注入)原理(三):Spring启动加载配置文件源码分析
- Spring学习笔记——Spring依赖注入原理分析
- spring集合
- Spring MVC 解读——@Autowired、@Controller、@Service从原理层面来分析
- 启动hbase输出ignoring option PermSize=128m; support was removed in 8.0告警信息
- 【matlab】样条函数:csapi、spap2和augknt的使用
- 洛谷 P1019 单词接龙
- Spring -- 依赖注入源码分析
- Tricks in decide the index in the binary search with duplicate elements
- pva-faster-rcnn配置过程出现的问题(个人笔记)
- win10使用远程桌面时提示“你的凭据不工作”报错的解决办法
- Android中的EventBus使用(一)
- 3.4 迭代器
- 分布式事务一致性解决方案
- Redis安装和自启动配置
- java 利用httpclient 3.1 和 httpclient4.1.2发送post请求