Spring总结—— IOC 和 Bean 的总结
一、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/
Spring总结—— IOC 和 Bean 的总结的更多相关文章
- Spring框架---IOC装配Bean
IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...
- 死磕Spring之IoC篇 - Bean 的“前身”
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- 死磕Spring之IoC篇 - Bean 的创建过程
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- 死磕Spring之IoC篇 - @Bean 等注解的实现原理
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- 死磕Spring之IoC篇 - 文章导读
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- Spring 框架 详解 (三)-----IOC装配Bean
IOC装配Bean: 1.1.1 Spring框架Bean实例化的方式: 提供了三种方式实例化Bean. * 构造方法实例化:(默认无参数) * 静态工厂实例化: * 实例工厂实例化: 无参数构造方法 ...
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
- Spring(一)之IOC、bean、注入
[TOC] spring简介 首先它是一个开源的.用来简化企业级应用开发的框架. Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务. 用RMI或web service远程 ...
- (转)java之Spring(IOC)注解装配Bean详解
java之Spring(IOC)注解装配Bean详解 在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...
随机推荐
- Java Native Interface Specification—Contents
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html 1. Introduction Java Nati ...
- 转:HTML5标准与性能之四:asm.js
HTML5标准与性能之四:asm.js Cong Liu (Intel) 于 星期五, 24/05/2013 - 01:13 提交 之前的几篇文章分别介绍了WebWorkers.Typed Array ...
- IOS从一个APP跳到另一个APP
以下为跳转到大众点评APP代码如下: NSString *requestUrlString = @"dianping://shopinfo?id=1000"; NSURL *req ...
- 数据仓库专题(23):总线矩阵的另类应用-Drill Down into a More Detailed Bus Matrix
一.前言 Many of you are already familiar with the data warehouse bus architecture and matrix given thei ...
- 【Linux】——ctags
ctags的功能:扫描指定的源文件,找出其中所包含的语法元素,并将找到的相关内容记录下来. ctags 可以在官网上下载源代码,然后编译安装.最后在 ~/.vimrc 文件中写入以下配置: " ...
- 第 3 章 MySQL 存储引擎简介
第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...
- shell编程总结
一.学习 shell脚本之前的基础知识 [linux shell中的特殊符号] 1. * :代表零个或多个字符或数字. test后面可以没有任何字符,也可以有多个字符,总之有或没有都能匹配出来. 2. ...
- [原创]Android插件化的一种实现
Android的插件化已经是老生常谈的话题了,插件化的好处有很多:解除代码耦合,插件支持热插拔,静默升级,从根本上解决65K属性和方法的bug等等. 下面给大家介绍一下我们正在用的插件化框架.本片主要 ...
- iOS开发备忘录:实现多StoryBoard之间跳转
iOS项目中可以将同一业务流程的页面归置到一个StoryBoard中,项目中必然会包含多个StroryBoard,可以利用跳转,实现项目的不同业务流程页面间的跳转切换. 实现思路: 1,项目(Proj ...
- saiku 分布式实践
saiku比较吃内存,一旦人多了,那么内存可能不够,所以会考虑主从结构,分担压力.为了保证数据的稳定性,也会有类似的考虑,那么问题来了,如何实现saiku的分布式搭建哪? 我阅读了一些国内的文章,没有 ...