一、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 的总结的更多相关文章

  1. Spring框架---IOC装配Bean

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...

  2. 死磕Spring之IoC篇 - Bean 的“前身”

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  3. 死磕Spring之IoC篇 - Bean 的创建过程

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  4. 死磕Spring之IoC篇 - @Bean 等注解的实现原理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  5. 死磕Spring之IoC篇 - 文章导读

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  6. Spring 框架 详解 (三)-----IOC装配Bean

    IOC装配Bean: 1.1.1 Spring框架Bean实例化的方式: 提供了三种方式实例化Bean. * 构造方法实例化:(默认无参数) * 静态工厂实例化: * 实例工厂实例化: 无参数构造方法 ...

  7. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  8. Spring(一)之IOC、bean、注入

    [TOC] spring简介 首先它是一个开源的.用来简化企业级应用开发的框架. Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务. 用RMI或web service远程 ...

  9. (转)java之Spring(IOC)注解装配Bean详解

    java之Spring(IOC)注解装配Bean详解   在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...

随机推荐

  1. php加密解密功能类

    这两天突发奇想想要用php写一个对日常项目加密以及解密的功能,经过努力简单的封装了一个对php代码进行加密解密的类,一些思想也是来自于网络,初步测试用着还行,可以实现对指定项目的加密以及解密(只针对本 ...

  2. 搞了个基于zookeeper的Leader/Follower切换Demo

    基于zookeeper写了个Leader选举类库demo,场景如下: 上图中的Program1..4可以部署在1台server上,也可以部署在多台server上,也可以是一个进程中的多个线程. 运行效 ...

  3. 准备开源一套异形UI控件

    今天整理磁盘,发现在一个以前加密过的一个磁盘文件中发现了一些以前做的UI代码.平时都没怎么去用,放着放着只会慢慢的去遗忘,所以打算慢慢的将一些UI代码整理整理,然后开源出来,集合广大Delphier的 ...

  4. 菜鸟教程之工具使用(十四)——Maven项目右击没有“Maven”菜单选项

    从Git导入一个Maven项目,右击想更新Maven引用的jar包,却发现右键菜单根本没有“Maven”菜单项.怎么办?很简单,按如下步骤操作即可: 从Git导入后,右击项目没有“Maven”菜单项: ...

  5. console 让 js 调试更简单

    浏览器的控制台(console)是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 显示信息 console.log('hello world'); console.debug('debug' ...

  6. 处理XML

    虽然被JSON抢了风头,但XML仍旧非常重要.看得见的,看不见的,XML在很广泛的领域对我们发挥着影响. 修改XML文件,是我经常遇到的事情.方式从手动在Visual Studio或者Notepad+ ...

  7. pidgin修改来消息字体大小

    vi ~/.gtkrc-2.0写入如下内容设置自己想要的字体大小 style "imhtml-fix"{    font_name = "Sans 14"} w ...

  8. Qt编写自定义控件二动画按钮

    现在的web发展越来越快,很多流行的布局样式,都是从web开始的,写惯了Qt widgets 项目,很多时候想改进一下现有的人机交互,尤其是在现有的按钮上加一些动画的效果,例如鼠标移上去变大,移开还原 ...

  9. Web API 入门系列- 从一个示例开始

    1.新建Web API项目 2.新建bookModel 3.新建book web api 控制器 为了简单方便,演示系统使用内存集合持久化书籍. 4.测试web api 我们怎么方便测试web api ...

  10. HIVE: UDF应用实例

    数据文件内容 TEST DATA HERE Good to Go 我们准备写一个函数,把所有字符变为小写. 1.开发UDF package MyTestPackage; import org.apac ...