Spring源码分析笔记
本文参考学习自[Spring:源码解读Spring IOC原理]
总结以下几个问题:
1.什么是IOC/DI?
2.BeanDefinition、BeanFactory、FactoryBean是什么?
3.什么是IOC容器的初始化?初始化包括哪些内容?
4.依赖注入发生的时间?
1.什么是IOC/DI?
IOC(Inversion Of Control):控制反转。所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器(也称为Spring容器或IOC容器)来帮忙实现。而对象与对象的关系通过配置文件(xml、properties文件 )来描述。
DI(Dependency Injection):依赖注入。就是注入某个对象所需要的外部资源。可理解将对象依赖的外部资源(如其他Bean)设置给对象。
2.BeanDefinition、BeanFactory、FactoryBean是什么?
BeanDefinition:Spring IoC将XML形式定义的Bean定义资源文件转换为Spring IoC所识别的数据结构——BeanDefinition。正是有了这些数据,容器才可以进行依赖注入。
BeanFactory:Bean工厂,是一个Factory,Spring IoC容器的最顶层接口就是这个BeanFactory,它的作用是管理Bean,即实例化、定位、配置应用程序中对象的建立及对象间的依赖。BeanFactory作为最顶层的一个接口类,Spring中的实现了该接口的类,就可称为容器。
FactoryBean:工厂Bean,是一个Bean,作用是产生其他bean实例,或者说得到工厂Bean生产的Bean。可以使用转义字符“&”来得到FactoryBean本身。
3.什么是IOC容器的初始化?初始化包括哪些内容?
概述
IOC容器的初始化包括BeanDefinition的Resource定位、载入、注册这三个基本过程。
以下对概述进行延伸总结:创建IOC容器,通过xml配置文件读取资源,并封装为Resource资源,将资源转换为Document对象,然后解析成BeanDefinition(Bean定义信息,当依赖注入时才使用这些记录信息创建和实例化具体的Bean对象),最后向容器注册BeanDefinition(注册过程就是在 IOC 容器内部维护的一个HashMap 来保存得到的 BeanDefinition 的过程)完成IOC容器的初始化,但此时还未发生依赖注入。更多源码分析参考 [Spring:源码解读Spring IOC原理]
4.依赖注入发生的时间?
当Spring IoC容器完成了Bean定义资源的定位、载入和解析注册以后(即完成IoC容器的初始化后),IoC容器中已经管理类Bean定义的相关数据,但是此时IoC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况发生:
①. 用户第一次通过getBean方法向IoC容索要Bean时,IoC容器触发依赖注入。
②. 当用户在Bean定义资源中为<Bean>元素配置了lazy-init属性(默认是配置了,即默认是在容器初始化完成后),即让容器在解析注册Bean定义时进行预实例化,触发依赖注入。
参考: