IoC容器的实现学习——01目录
- IoC容器的实现学习——01
- 简介
- IoC 容器系列的设计与实现:BeanFactory 和 ApplicationContext
- BeanFactory
- loadBeanDefinition()
- ApplicationContext
- BeanFactory
- 小结
所以出现了
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](http://img.zhejianglong.com/231018/0531213c4-0.png)
文章插图
这些规范,体现了 IoC 容器最基本的特性 。
其中主要的方法就是
getBean()
方法,还有一些其他的检索方法,是最为基本的容器入口 。可以通过分析一个基本的 IoC 容器——
XmlBeanFactory
实现,来尝试理解简单 IoC 容器的设计原理 。![Spring 深入——IoC 容器 01](http://img.zhejianglong.com/231018/0531213495-1.png)
文章插图
?
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 过程 。可能思路还不是很清晰,接下来就简单解释一下一些类:
- BeanDefinition:
这个类是 Spring 为了方便 IoC 容器管理 POJO (Bean) 对象而对其进一步抽象的数据结构,根据资源所定义的信息来创建具体的 Bean 对象 。
假设我们通过 XML 的形式来让 IoC 容器帮我们管理 Bean 对象,其实我们在 XML 中定义的是 BeanDefinition,我们通过<bean/>
标签来创建 Bean , 实际上是在描述一个 BeanDefinition,而当 IoC 容器通过 Reader 定位到 需要的 BeanDefinitieon,则是根据 Reader 解析好的 BeanDefinition 信息来创建我们描述好的 Bean 对象,并进行管理 。
- BeanDefinitionReader:
读取 Spring 配置文件中的内容 , 并将其转换为 IoC 容器的内部数据结构:BeanDefinition 。
在 XBF 中 XBDR 就是 BDR 的一个具体实现,Spring 的配置内容是 XML,所以根据 XML 的形式来转换 BeanDefinition 。
- Resource:
Spring 统一对不同来源的资源进行底层抽象,方便统一管理不同的资源 。
通过简单的观察继承关系和部分源码,大概分析是 Spring 对不同来源的资源统一进行底层资源封装或抽象 。
再通过不同的实现类对具体的资源面向用户提高具体的服务接口 。推荐阅读
- 这些不知道,别说你熟悉 Spring
- spring boot项目使用mybatis-plus代码生成实例
- 使用 Spring Security 手动验证用户
- SpringBoot实战派读书笔记---响应式编程
- 面向对象的照妖镜——UML类图绘制指南
- vue2双向绑定原理:深入响应式原理defineProperty、watcher、get、set
- Springboot集成阿里云短信
- 一个C#开发者学习SpringCloud搭建微服务的心路历程
- spring boot集成redis基础入门
- 从SpringBoot启动,阅读源码设计