spring源码学习--IOC容器初始化
前言:spring源码是我觉得对于java开发来讲最值得去阅读的框架代码,不仅是因为它强大,更吸引我的是它整体的设计思路非常优秀,也是因此,厂里架构师非常推荐我们去读读源码。
IOC容器的相关实现
IOC容器最底层的是一个BeanFactory,它本身是一个接口,然后有各种实现方案,从大的方向看,它是分了2种层次实现。一种是实现BeanFacoty接口,这是IOC容器最基本功能的实现,具体实现比如XmlBeanFactory,DefaulListableFactory;另一种是ApplicationContext应用上下文的高级形态的实现,具体实现比如ClassPathApplicationContext,WebApplicationContext,而实际上,第二种实现是在第一种方式的基础上进行继承,并且拓展了一些高级的方法。
IOC容器的初始化过程
IOC容器初始化过程,主要是包括3个步骤,一是定位BeanDefinition的Resource;二是载入Resource描述的BeanDefinition;三是将BeanDefinition注册到IOC容器。
1.1定位BeanDefinition的Resource
通俗地讲,BeanDefinition就是IOC容器里面的一个个bean,而Resource其实就是描述bean的配置文件,比如常见的就是applicationContext.xml文件。那么在spring里面是如何实现的呢。看个例子:
ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
上面有提到FileSystemXmlApplicationContext是IOC的一种高级形态,看下它的父类结构:
所以可以看到它是由 BeanFacotry和ResourceLoader一路继承下来的,很明显BeanFacotry其实用来装bean的,而ResourceLoader,就是读取bean的相关Resource,然后将读取的bean载入beanFacotry。
了解到整体的结构后,开始进入到具体的代码实现上。从整体来讲,具体代码实现有这么几个步骤:
1.初始化bean的Resource的具体地址(文件)
2.创建一个BeanFactory
3.获取ResourceLoader进行读取ReSource文件
1.2载入BeanDefinition
这个环节主要是将配置文件进行解析,将里面描述的bean封装成BeanDefinition. 配置文件的解析是通过一个文档解析器BeanDefinitionDocumentReader进行解析。在这个环节也可简单分为
- 创建一个BeanDefinitionDocumentReader
- BeanDefinitionDocumentReader对Resource进行解析,将bean封装成BeanDefinition
1.3 BeanDefinition注册进BeanFactory
这个环节主要是将BeanDefinition注册进BeanFactory,它的实现原理是将解析出来的bean封装成BeanDefinition放入一个HashMap里面。IOC容器主要默认的BeanFacotry是 DefaulListableFactory,所以这个hashMap就是在它里面。
总结
spring大致的架构 以及 核心的IOC容器的初始化过程,有了大致的了解后,接下来就逐个环节的代码进行细致的了解。