一、Spring 官方文档中给出的 Spring 的整体结构。
二、我自己所理解的 Spring 整体结构图。
三、本次总结 Spring 核心部分
1.从上面图中可以看出,Beans 和 Context 和 Core 组件作为 Spring 的核心组件,它们构成了整个 Spring 的骨架。
2.从根本说来说,Spring 最终操纵的还是 Bean,所以说 Bean 是整个 Spring 核心中的核心。
3.和正常编程的思想不同,Spring 把对象之间的依赖关系转而由配置文件进行管理,也就是他的依赖注入机制。而这个注入关系在一个 IOC 容器中进行管理。
IOC 容器中包含有什么?其实就是被一个个 bean 包含的对象。IOC 容器可以看成是 beans 关系的一个集合。
4.这种设计策略完全类似于 Java 实现的 OOP 设计理念,构建一个数据结构,然后根据这个数据结构设计它的生存环境,并赋给它生命周期,使他在一定规律下不停的运动,在不停运动的过程中完成与其他个体的交互。
5.核心组件之间如何进行协同工作的:举一个非常好的例子,如果说 Bean 是一场话剧的演员的话,那么 Context 就是舞台,而 Core 就是道具,它们三个是演话剧最基本的元素。
我们知道 Bean 包装的是一个 Object,而 Object 中存在数据,而给这些数据提供生存环境就是 Context 要解决的问题,对于 Context 而言,它要发现每个 Bean,以及 Bean 与
Bean 之间的关系,建立和维护好这种关系。所以 Context 就是 Bean 关系的集合,这个关系集合又叫 IOC 容器,而一旦建立起这个容器,Spring就可以进行工作了。那么 Core 是
用来做什么的呢?发现、建立和维护 Bean 之间的关系所需要的一系列的工具,它为 Bean 组件和 Context 组件提供了支持。
四、Bean 组件
1.Bean 组件位于 Spring 的 org.springframework.beans 包下。
而这个包下的所有类主要解决了三件事情:Bean 的定义、Bean 的创建以及对 Bean 的解析。对于使用者来说,我们只需要关注 Bean 的创建就 ok。其他两个由 Spring 完成。
2.Spring Bean 的创建是典型的工厂模式,他的顶级接口是 BeanFactory。
3.Bean 的定义主要由 BeanDefinition 描述,Bean 的定义就是描述了在 Spring Config 文件中 节点及其子节点的所有信息。
当 Spring 成功解析你定义的一个 节点后,在 Spring 内部就会转化为 BeanDefinition 对象。以后所有的操作都是由这个对象来完成。
4.Bean 的解析主要就是对 Spring 配置文件的解析,顶级接口为 BeanDefinitionReader 和 BeanDefinitionDocumentReader。
五、Context 组件
1.Context 组件位于 Spring 的 org.springframework.context 包下,它的作用就是为 Bean 提供一个运行时环境,并且维护好 Bean 之间的关系。
2.BeanFactory 作为 Context 的顶级接口。
ApplicationContext 为 Context 组件的常用接口,它除了能标识一个应用环境的基本信息外,他还继承了6个接口,他们扩展了 Context 的功能。
从上图可以看出 ApplicationContext 接口继承了 BeanFactory 接口,由此也可以看出 Spring 运行的主体是 Bean。另外间接继承了 ResourceLoader 接口,
也就可以访问到外部资源。
然后再看它的两个子接口:
(1).ConfigurableApplicationContext 表示该 Context 是可以修改的,也就是说在构建 Context 时用户可以添加或修改已有的配置。
(2).WebApplicationContext 就是为 Web 环境准备的 Context,它可以访问到 ServletContext。
对于 ApplicationContext 来说,必须要完成的几件事情:
(1)标识一个应用环境
(2)利用 BeanFactory 创建 Bean 对象
(3)保存对象关系表
(4)能够捕获各种事件
Context 作为 Spring 的 IOC 容器,基本上整合了 Spring 的大部分功能,或者说是大部分功能的基础。
六、Core 组件
1.Core 组件作为 Spring 的核心组件,它其中包含了很多关键的类,其中一个重要的组成部分就是定义了资源的访问方式。将所有资源都抽象为一个接口 Resource。
Resource 类结构图:
从上图可以看到 Resource 类封装了各种可能的资源类型,继承了 InputStreamSource 接口,对使用者来说屏蔽了资源类型的不同。所有资源都可以通过 getInputStream() 获取到。
2.Context 与 Resource 之间的关系:Context 是把资源的加载、解析和描述工作委托给 ResourcePatternResolver 类来完成,他把资源的加载、解析和资源的定义整合到了一起便于
其他组件使用。
七、IOC 容器是如何进行工作的
1.IOC 容器实际上就是结合其他两个组件共建了一个 bean 关系网。
2.如何创建 BeanFactory 工厂
3.如何创建 Bean 实例并构建 Bean 之间的关系网
4.如何对 Bean 进行扩展
八、上面内容是从宏观上对 Spring 核心的三个组件进行了介绍,其中大部分内容是借鉴的别人的,下面列出具体知识细节
9.最后想说的是,我自己认为如果想学好 Spring 的话,必须对其思想有所深刻理解,然后以此为驱动去学习,有章法,事半功倍。