该系列主要根据《SPRING技术内幕:深入解析SPRING架构与设计原理》一书整理。
Spring IOC容器的设计中,存在两个主要的容器系列,一个是实现BeanFactory接口的简单容器,这系列容器只实现了容器的最基本功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态存在,在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境做了许多适配。
1-1 Spring IOC容器概况
1-2 Spring IOC资源概况
所以Beanfactory接口是作为一个最基本的接口类出现在Spring IOC容器体系中的。在这些Spring提供的基本IOC容器的接口定义和实现的基础上,Spring通过定义BeanDefinition来管理基于spring的应用中的各种对象以及它们之间的相互依赖关系。BeanDefinition抽象定义了我们对Bean的定义,是让容器起作用的主要数据类型。
1-3 IOC容器的接口设计
下面对接口设计做简要分析:
1、BeanFactory→HierarchicalBeanFactory→ConfigurableBeanFactory是一条主要的BeanFactory设计路线。BeanFactory接口定义了基本的IOC容器规范。HierarchicalBeanFactory增加了getParentBeanFactory、containsLocalBean方法,具备了双亲IOC容器管理功能。ConfigurableBeanFactory主要定义了一些Bean的配置功能,比如addBeanPostProcessor()配置bean后置处理器,setParentBeanFactory()设置双亲IOC容器。
2、第二条接口设计的主线是以ApplicationContext为核心,从BeanFactory→ListableBeanFactory→ApplicationContext,再到WebApplicationContext或者ConfigurableWebApplicationContext。我们常用的上下文基本上就是WebApplicationContext或者ConfigurableWebApplicationContext,连接BeanFactory和ApplicationContext应用上下文的接口定义。在ListableBeanFactory,细化了许多BeanFactory接口的功能。对于ApplicationContext继承了 EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver。
3、这里涉及的主要是接口关系,具体的IoC容器都是在这些接口下实现的,比如DefaultListableBeanFactory
BeanFactory
BeanFactory容器的设计原理
DefaultListableBeanFactory作为一个默认的功能完整的IoC容器来用。
ApplicationContext
ApplicationContext实现的接口
因此ApplicationContext比BeanFactory多了许多附加的功能。
1、 支持不同的信息源
2、 访问资源
3、 支持应用实践
ApplicationContext容器设计原理
以常用的FileSystemXmlApplicationContext为例,ApplicationContext应用上下文的主要功能在基类AbstractXmlApplicationContext中实现了,它只要实现与自己设计相关的两个功能就行了。
1、 直接使用FileSystemXmlApplicationContext,实例化这个应用上下文,同时启动IoC容器的refresh()。
Refresh是IoC容器启动的一系列复杂的操作,对于不同的容器,都是相似的,在这里只是一个简单的调用,后面会专门分析。
2、 从文件系统中加载XML的bean定义资源
该过程为在文件系统中读取以XML形式存在的BeanDefinition做准备