Spring依赖注入源码分析

Bean已经实例化,我们来看看依赖注入的具体实现。
回到AbstractAutowireCapableBeanFactory类的populateBean方法。
Spring依赖注入源码分析_第1张图片
Spring依赖注入源码分析_第2张图片
Spring依赖注入源码分析_第3张图片
Spring依赖注入源码分析_第4张图片
方法中,先从RootBeanDefinition中获取属性值,这些属性保存的内容是配置文件解析完之后的值,将配置文件解析成BenDefinition的过程,前面有专门的文章描述。
Spring依赖注入源码分析_第5张图片
applyPropertyValues中遍历RootBeanDefinition中获取到的属性值集合,获取集合中的每一个属性值,并在resolveValueIfNecessary方法中根据从属性值中获取到的值的类型来判断使用何种方式来处理。我们以RuntimeBeanReference类型进行说明。
Spring依赖注入源码分析_第6张图片
方法中refName是当前Bean所依赖的Bean的名字,那么beanFactory获取到的就是当前Bean所依赖的Bean的实例。也就是说在对当前Bean进行依赖注入前要先获取依赖的Bean的实例,即对当前Bean进行依赖注入之前要先实例化依赖的Bean。
获取到依赖的实例之后,还要维护当前Bean和依赖的Bean之间的依赖关系,需要将他们之间的依赖关系保存起来。保存依赖关系的实现在registerDependentBean方法中。
Spring依赖注入源码分析_第7张图片
dependentBeanMap中存放着当前Bean被引用的Bean的集合。比如当前需要实例化的是Bean的名字是userInfo,userInfo中有个Human类型的属性human,那么就有human被userInfo引用的关系,此时dependentBeanMap中的值就是
Spring依赖注入源码分析_第8张图片
而dependenciesForBeanMap中存放的则是当前Bean所依赖的Bean的集合。
依赖注入的具体实现是在BeanWrapperImpl类中的setPropertyValue方法里。
setPropertyValue中的代码较多,这里就不截图了。这个方法对注入类型进行了分类,分成了集合的注入和非集合的注入。例如集合的注入过程,根据集合的类型进入的相应的分支进行的处理,比如List类型的注入,就进入List的分支。前面的步骤都是在为注入进行准备,准备Bean所依赖的对象。
Spring依赖注入源码分析_第9张图片
正真的注入操作就这一行代码,获取注入属性的set方法,通过反射机制,将对象注入进去。
Spring依赖注入源码分析_第10张图片
依赖注入的过程已大致分析完。IOC容器的作用是管理对象之间的依赖关系,通过前面的分析,我们已知道Spring通过dependentBeanMap和dependenciesForBeanMap两个集合来管理依赖关系。具体过程是:遍历从BeanDefinition中获取到的属性集合,这些属性集合也就是当前Bean所依赖的集合,根据每个依赖属性的名称获取依赖属性对应的实例。然后再根据依赖属性的名称获取引用到该依赖属性实例的Bean的名称的集合,并将当前的beanName加入到集合中。最后根据当前beanName获取当前Bean的依赖属性的名称的集合,并将依赖属性的名称加入到集合中。
IOC容器的实现原理已大致分析完,接下来打算对AOP的实现原理进行简单的分析。
未完待续。。。。。。

你可能感兴趣的:(spring)