一、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 文件中 <bean> 节点及其子节点的所有信息。
当 Spring 成功解析你定义的一个 <bean> 节点后,在 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 的话,必须对其思想有所深刻理解,然后以此为驱动去学习,有章法,事半功倍。
借鉴地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/