Spring 深入——IoC 容器 01

IoC容器的实现学习——01目录

  • IoC容器的实现学习——01
    • 简介
    • IoC 容器系列的设计与实现:BeanFactory 和 ApplicationContext
      • BeanFactory
        • loadBeanDefinition()
      • ApplicationContext
    • 小结
简介在以前通常情况下一个简单的项目一般由两个及两个以上的类构成,大多数的类集数据和数据的处理方法于一体,类之间通过依赖彼此的数据和方法实现业务逻辑,这个获取依赖的过程是自己实现的,导致代码高度耦合以及难以测试 。
所以出现了DI (依赖注入)、IoC (控制反转) 这些将对象的依赖关系转交给平台或容器进行管理的设计模式,而在 Spring 核心中 IoC 容器就是这种模式的实现 。通过将对象的依赖控制交给 IoC 容器从而有效降低代码的耦合度,提高代码的可测试性 。
IoC 容器需要解决的核心问题是如何将对象的控制权从对象转交给平台或框架中 。
IoC 核心思想是关于一个对象如何获取它所依赖的对象引用 。
这次除了对 IoC 的简单回顾 , 还有对 Spring 框架实现的 IoC 容器进行设计和实现上的分析 , 深入了解一下 Spring IoC 独特的特点 。
IoC 容器系列的设计与实现:BeanFactory 和 ApplicationContextBeanFactory 接口系列:只实现了容器的基本功能 。
ApplicationContext 应用上下文系列:在简单容器的基础上增加了许多面向框架的特性 , 同时对不同的应用场景进行了适配 。
下面对其两者进行逐一分析 。
BeanFactory基本概念:BeanFactory 接口定义了一个 IoC 容器所应该具备的最基本服务,同时也是我们使用 IoC 容器遵守的最底层和最基本的编程规范 。
同时有许多的类实现了 BeanFactory 这个基本接口,并在其基础上进行了适当的扩展形成了具体的 IoC 容器,以针对不同的场景供用户选择 , 其中 ApplicationContext 也是在其基础上构造的 。
BeanFactory 接口的源码:
Spring 深入——IoC 容器 01

文章插图
这些规范,体现了 IoC 容器最基本的特性 。
其中主要的方法就是 getBean()方法,还有一些其他的检索方法,是最为基本的容器入口 。
可以通过分析一个基本的 IoC 容器—— XmlBeanFactory 实现,来尝试理解简单 IoC 容器的设计原理 。
Spring 深入——IoC 容器 01

文章插图
?
XmlBeanFactory 使用了 DefaultListableBeanFactory 作为基类,两者作为基本的 IoC 容器,通过观察 XBF 这个类名,可以猜到大概是通过 XML 文件来解析 BeanDefinition,并初始化 IoC 容器(事实也是如此) 。
可以看到有一个常量,XmlBeanDefinitionReader 这个类是用来解析处理以 XML 形式定义的 BeanDefinition,是 Reader 对象,但是并不是它来获取 XML 资源,XML 资源是交由另一个对象(Resource)来获取并抽象的 。Resource 是 Spring 用来封装 I/O 操作的类(称为定位 BeanDefinition 资源),例如 ClassPathResource 这个类可以指定获取到具体的资源 , 并且将 Resuorce 交由 XBF 的构造函数,这样 IoC 容器就可以方便的定位到需要的 BeanDefinition 信息对 Bean 完成容器的初始化和 DI 过程 。
可能思路还不是很清晰,接下来就简单解释一下一些类: