此篇文章为Spring5源码分析——IOC容器的初始化的最后一篇,这一篇主要是对IOC容器的初始化进行总结。html
经过上面的几篇文章咱们完成了对FileSystemXmlApplicationContext IOC容器建立的分析,接下来总结一下IOC容器初始化的基本步骤。
1. 初始化的入口在容器实现中的 refresh()调用来完成。
2. 对 bean 定义载入 IOC 容器使用的方法是loadBeanDefinition,其中的大体过程以下:经过ResourceLoader来完成资源文件位置的定位,DefaultResourceLoader是默认的实现,同时上下文自己就给出了 ResourceLoader 的实现,能够从类路径,文件系统,URL 等方式来定为资源位置。若是是 XmlBeanFactory 做为 IOC 容器,那么须要为它指定 bean 定义的资源,也就是说bean定义文件时经过抽象成Resource来被IOC容器处理的,容器经过BeanDefinitionReader来完成定义信息的解析和Bean 信息的注册 , 每每使用的是XmlBeanDefinitionReader来解析bean的xml定义文件-实际的处理过程是委托给BeanDefinitionParserDelegate来完成的,从而获得 bean 的定义信息,这些信息在Spring中使用BeanDefinition对象来表示这个名字可让咱们想到loadBeanDefinition,RegisterBeanDefinition这些相关方法-他们都是为处理 BeanDefinitin 服务的,容器解析获得BeanDefinition之后,须要把它在IOC容器中注册,这由IOC实现BeanDefinitionRegistry接口来实现。注册过程就是在 IOC 容器内部维护的一个 HashMap 来保存获得的 BeanDefinition 的过程。这个 HashMap 是 IOC 容器持有 Bean 信息的场所,之后对 Bean 的操做都是围绕这个 HashMap 来实现的。 web
而后咱们就能够经过BeanFactory和ApplicationContext来享受到SpringIOC的服务了,在使用IOC容器的时候,咱们注意到除了少许粘合代码,绝大多数以正确IOC 风格编写的应用程序代码彻底不用关心如何到达工厂,由于容器将把这些对象与容器管理的其余对象钩在一块儿。基本的策略是把工厂放
到已知的地方,最好是放在对预期使用的上下文有意义的地方,以及代码将实际须要访问工厂的地方。Spring自己提供了对声明式载入web应用程序用法的应用程序上下文,并将其存储在ServletContext中的框架实现。spring
如下是容器初始化全过程的时序图:
编程
在使用Spring IOC 容器的时候咱们还须要区别两个概念:
BeanFactory 和 FactoryBean , 其中BeanFactory指的是IOC容器的编程抽象,好比ApplicationContext,XmlBeanFactory等,这些都是IOC容器的具体表现,须要使用什么样的容器由客户决定,但 Spring为咱们提供了丰富的选择。FactoryBean只是一个能够在IOC而容器中被管理的一个Bean,是对各类处理过程和资源使用的抽象,FactoryBean 在须要时产生另外一个对象,而不返回FactoryBean自己,咱们能够把它当作是一个抽象工厂,对它的调用返回的是工厂生产的产品。全部的
FactoryBean 都实现特殊的 org.springframework.beans.factory.FactoryBean 接口,当使用容器中 FactoryBean 的时候,该容器不会返回 FactoryBean 自己,而是返回其生成的对象。Spring 包括了大部分的通用资源和服务访问抽象的 FactoryBean 的实现,其中包括:对 JNDI 查询的处理,对代理
对象的处理,对事务性代理的处理,对 RMI 代理的处理等,这些咱们均可以当作是具体的工厂,当作是Spring 为咱们创建好的工厂。也就是说 Spring 经过使用抽象工厂模式为咱们准备了一系列工厂来生产一些特定的对象,免除咱们手工重复的工做,咱们要使用时只须要在 IOC 容器里配置好就能很方便的使
用了。 框架
更多文章请查看个人专栏 Spring5.0源码学习源码分析
须要原图请留言。学习
文档有参考其余资料,若是问题请联系我,进行删除!.net