Spring 深入——IoC 容器 01( 二 )


通过解释或者百度几个关键类,我们应该能理解 IoC 容器初始化的简单过程 。
观察 XBF 的源码可以发现除了使用 XBDR 对象进行资源的解析和加载 , 并没有看到关于 IoC 容器的初始化过程,看到 super(parentBeanFactory) 这句代码调用了父类 —— DefaultListableBeanFactory 的构造方法,从而完成了 IoC 容器的构建 。那么我们初步可以分析出 DefaultListableBeanFactory 应该是 XBF IoC 容器创建的重要对象 。实际上它也是个基本 IoC 容器 。
直到这里我们就简单分析出了 XBF IoC 容器的创建过程 。
loadBeanDefinition()通过 reader 解析好的 Bean 信息加载到 BeanFactory (IoC 容器)中 。
ApplicationContext对于开发人员来说,例如开发一个 Web 服务端 , 如果要开发人员手动控制 Bean 的配置和容器的建立过程,无疑是非常痛苦的 , 所以 Spring 帮我们定义了许多已经实现好的容器,并且这些容器面向的需求也不一样 , 相对于已经实现的简单 BeanFactory 容器,不能很大程度上满足开发人员的需求,所以 ApplicationContext 无疑是更好的选择 。
之前介绍了 ApplicationContext 是在基本 IoC 容器上,进行了更大程度的扩展,让 IoC 容器面向框架,提供更多的服务 , 方便开发人员的使用,更加专注于业务逻辑的实现 。同时也是对 IoC 容器一次全面的更新和扩展 。
AC 扩展了一些接口,在基础 IoC 容器上添加了附加功能 , 这些额外的功能为 AC 提供了 BeanFactory 不具备的特性:

  • 支持不同的信息源:扩展了 MessageSource 接口,支持国际化,为开发多语言版本的应用提供服务 。
  • 访问资源:主要体现在对 ResourceLoader 和 Resource 的支持上 , 让我们可以获从不同的地方获取 Bean 资源,主要是可以在不同的 I/O 途径获取 Bean 定义信息 。这里的指的是具体的 ApplicationContext 容器,一般来说都是继承了 DefaultResourceLoader 的子类,因为 DefaultResourceLoader 是 AbstractApplicationContext的基类 。
  • 支持应用事件
    继承了接口 ApplicationEventPublisher,从而在上下文中引入了事件机制,这些事件结合 Bean 的生命周期对 Bean 管理提供了便利 。
  • 提供其他附加服务
    这些其他的附加服务,使得基本的 IoC 的功能更加丰富,使它的使用是一种面向框架 的使用风格 。
设计原理:
以常用的 FileSystemXmlApplicationContext 的实现为例说明 ApplicationContext 容器的设计原理 。
通过观察 FSXAC 的源码,AC 容器的主要功能已经在 FSXAC 的基类 AbstractXmlApplicationContext 中实现了,所以 FSXAC 只要实现与自身设计相关的两个功能 。
功能一:如果直接使用 FSXAC,对于实例化这个应用上下文的支持,同时启动 IoC 容器的 refresh() 过程 。
refresh() 过程牵涉到 IoC 容器启动的一系列复杂操作,对于不同的容器,这些操作都是类似的,因此在基类(AbstractApplicationContext)中对其统一封装 。
public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException {super(parent);this.setConfigLocations(configLocations);if (refresh) {this.refresh();}}功能二: 如何从文件系统中加载 XML 的 Bean 定义资源有关 。
简单来说就是如何在文件系统中读取以 XML 形式存在的 BeanDefinition 做准备(并不是直接解析),因为不同的 AC 实现对应着不同的读取 BeanDefinition 的方式 。
protected Resource getResourceByPath(String path) {if (path != null && path.startsWith("/")) {path = path.substring(1);}return new FileSystemResource(path);}【Spring 深入——IoC 容器 01】上面是这个功能的实现,可以看到,调用这个方法可以得到 Resource 资源定位——FileSystemResource
小结本次学习了 IoC 容器的一些介绍和概念,抓住了在 Spring 中 IoC 容器的两大实现方式:BeanFactory 和 ApplicationContext.
借助常用或典型的实现类:XmlBeanFactoryFileSystemApplicationContext
通过简单分析两者的实现和设计区别,来尝试理解两者本质或定义上的区别,同时我们也在两者的实现和设计中,学到了 Spring IoC 容器中基础的组成部分:
  • BeanDefinition
  • BeanDefinitionReader
  • Resource
  • DefaultListableBeanFactory
  • loadBeanDefinitions() 方法
这些与 IoC 容器密切相关 。

推荐阅读