朱亮亮

Stay Hungry, Stay Foolish.

0%

Spring ApplicationContext 和 BeanFactory

Spring 的 BeanFactoryApplicationContext 所处的位置有所不同,使用的场景也有区别,但两者有着千丝万缕的联系。

BeanFactory

BeanFactory 在 Spring-Beans 模块中,是整个 Spring 容器的核心,也正是 BeanFactory 才让 Spring 成为一个容器,帮助 Spring 管理 Bean,并提供 DI 功能实现对 Bean 的依赖管理,使用配置方式来达到与业务代码和框架代码的分离。其主要的接口和类关系如下所示:

BeanFactory 接口是 Bean 容器设计中基本的职责定义接口,定义按照名称、类型、参数几个维度获取、判断 Bean 实例的职能

HierarchicalBeanFactoryBeanFactory 进行了扩展,定义了获取父容器和判断 Bean 是否在当前容器方法

ListableBeanFactory 实现了对 Bean 的枚举,以及对某些共有特征 Bean 的管理

AutowireCapableBeanFactory提供了 Bean 的创建、注入、Bean 创建前后扩展等职能,主要职责是处理当前容器的 Bean,使其达到可用状态

ConfigurableBeanFactory 提供了设置父容器、指定类加载器接口,并且为当前容器工厂设计 Bean 的定制型的解析处理器、类型处理器,主要目的是实现对 BeanFactory 的可配置性

ConfigurableListableBeanFactory 除了集成ListBeanFactoryAutowireCapableBeanFactoryConfigurableBeanFactory 这些接口的所有职能,还扩展了修改 Bean 定义信息和分析Bean的功能,并且实现了预实例化单例Bean及冻结当前工厂配置等功能

AbstractBeanFactory 是一个抽象类,实现了对基本容器功能定义的模板式封装和实现,同时实现对 Bean 信息的注册,但是对 Bean 的创建和定义描述信息等的处理使用了抽象化处理,交由子类实现

AbstractAutowireCapableBeanFactory 继承自 AbstractBeanFactory,主要解决 Bean 之间的依赖和注入问题,其中实现了 Bean 的创建方法,但 Bean 定义以及依赖关系并没有实现

DefaultListableBeanFactory继承自 AbstractAutowireCapableBeanFactory,是对 Bean 容器完全成熟的默认实现,可以直接对外使用

ApplicationContext

ApplicationContext 在 Spring-Context 模块中,是 Spring 上下文的核心。和 BeanFactory 类似,ApplicationContext 也能加载配置文件中定义的 Bean,将所有的 Bean 集中管理。同时,它增加了许多额外的功能

  1. 支持不同的信息源。扩展自 MessageSource,能够提供多信息源的支持
  2. 访问资源。扩展自 ResourcePatternResolver,可以从不同的地方获得 Bean
  3. 支持应用事件。扩展自 ApplicationEventPublisher,为应用环境引入事件机制
  4. 环境服务。扩展自 EnvironmentCapable,支持环境的配置获取
  5. 基础的容器服务。扩展自 ListableBeanFactoryHierarchicalBeanFactory

其主要接口和类的关系如下图:

由上图可以看出,ApplicationContext 主要分为两大类:Xml ApplicationContext 和 Web ApplicationContext。其中主要的类说明如下:

  1. ApplicationContext 是整个容器的基本功能定义类,继承了 BeanFactory,这说明容器也是工厂的多态实现。设计模式上采用了代理模式,内部持有一个 BeanFactory 实例,这个实例替它执行 BeanFactory 接口定义的功能。
  2. AbstractApplicationContext 是整个上下文容器的核心处理类,是真正容器的执行者,在内部使用了模板方法,实现了 Spring 的启动、停止、刷新、事件推送、BeanFactory 的默认实现以及虚拟机的注册回调等。
  3. GenericApplicationContext 是 Spring Context 中最容易构建 Spring 环境的实体类,涵盖了 Spring Context 中的核心功能,在某些不需要特别定制的场景中可以直接开箱使用。
  4. AbstractRefreshableApplicationContextXmlWebApplicationContext的核心父类,如果当前上下文持有BeanFactory,则关闭当前BeanFactory,然后为上下文生命周期的下一个阶段初始化一个新的BeanFactory,并且在创建新容器时仍然保持对其父容器的引用。