Spring核心组件剖析
简介
Spring框架如今已成为服务端开发框架中的主流框架之一,是web开发者的利器。然而,真正让人着迷的,还是与其实现相关的 原理,设计模式以及许多工程化的思想。本文主要探讨Spring的三大核心组件。
Spring的核心组件有很多,但真正构成其骨骼的,是Core,Context和Bean。
Bean
三者之中,Bean是核心中的核心。Bean实现了将对象通过配置文件的方式,由Spring来管理对象存储空间,生命周期的分配。通过依赖注入的方式,可以实现将对象注入到指定的业务逻辑类中。这些注入关系,由Ioc容器来管理。
因此,Spring的核心思想常常被称作BOP(Bean Oriented Programming),面向Bean编程。
Bean组件定义在Spring的org.springframework.beans包下,解决了以下几个问题:
- Bean的定义
- Bean的创建
- Bean的解析
使用者只需要关注Bean的创建,其他两个过程由Spring内部完成。

1.整体架构
Spring Bean的整体架构是典型的工厂模式,最上层的接口是BeanFactory。ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBean是其子类,目的是为了区分Spring内部对象处理和转化的数据限制。
- ListableBeanFactory: 表示这些Bean是可列表的
- HierarchicalBeanFactory: 表示这些Bean有继承关系
- AutowireCapableBeanFactory: 定义Bean的自动装配规则
这几个接口分别定义了Bean的集合、Bean的关系和Bean的行为。
2.Bean定义
Bean的定义主要由BeanDefinition描述,层次关系如下:

Spring的配置文件中定义的节点,成功解析后都会被转化为BeanDefinition对象,之后所有的操作都会在BeanDefinition对象之上进行。
3.Bean解析
Bean解析的主要任务是:对Spring的配置文件进行解析,最后生成BeanDefinition对象。
解析过程非常复杂,包括配置文件里所有的tag。主要参与的类如下:

Context
Bean包装的是一个个Object,Object中存储着业务所需的数据。所以,如何给这些数据及之间的关系提供生存、运行环境(即保存对象的状态),就是Context要解决的问题。Context实际上就是Bean关系的集合,又称之为Ioc容器。
ApplicationContext是Context最上层的接口,层次关系如下:

ApplicationContext能够标识一个应用环境的基本信息。其上继承了5个接口,用于拓展Context的功能,其中BeanFactory用于创建Bean,同时继承了ResourceLoader接口,用于访问任何外部资源。
ApplicationContext的子类,主要包括:
- ConfigurableApplicationContext: 用户可动态配置和修改信息的Context,其下AbstractRefreshableApplicationContext最为常用。
- WebApplicationContext:
为Web应用准备的Context,可以直接访问ServletContext。
总之,ApplicationContext必须完成的功能如下:
- 标识一个应用环境
- 利用BeanFactory创建Bean对象
- 保存对象关系表
- 捕获各种事件
作为Ioc容器,Context是Spring其他大部分功能的基础。
Core
Spring 发现、建立和维护Bean之间关系的一揽子工具,称之为Core。实际上就是所需的Util。
Core的重要组成部分之一是Resource。
1. Resource整体层次
Resource主要定义了资源的访问方式,所有资源都抽象到了Resource接口中,层次关系如下:

- 资源包装。Resource向上继承了InputStreamSource接口,所有的资源都通过InputStream来获取,从而屏蔽了资源提供者。
- 资源加载。Resource下的ResourceLoader接口,所有资源加载者统一实现该接口就能加载所有的资源,例如之前的ApplicationContext。
2. 与Context建立关系

如图,ApplicationContext通过ResourcePatternResolver接口与ResourceLoader进行交互,来进行资源的加载、解析和描述。ResourcePatternResolver将资源封装整合,便于其他组件使用。
总结
本文主要总结了构成Spring骨骼框架的三大核心组件及其之间的联系,以及对三者实现原理理解的一些心得体会。
作者: I'm coding
链接:ACFLOOD
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如果您觉得本文对您有所帮助,就给俺点个赞吧!
参考书籍:《深入分析Java Web技术内幕》(许令波)
图片来源:《深入分析Java Web技术内幕》(许令波)
Spring核心组件剖析的更多相关文章
- Spring 核心组件总结
spring核心组件总结 spring介绍 spring概念 IOC: Inverse Of Control 控制反转 将我们创建对象的方式反转了,以前创建对象是由我们开发人员自己维护,包括依赖注 ...
- Spring 核心组件工作原理简析
Spring Framework 的核心组件有三个: Spring Core,Spring Context 和 Spring Beans,它们奠定了 Spring 的基础并撑起了 Spring 的框架 ...
- spring核心组件
spring的对象是bean组件,就像面向对象的object,bean包装的是object.context的作用,发现每个bean之间的关系,为他们之间建立好这种关系并进行维护.所以,可以把conte ...
- Spring核心组件知识梳理
Spring的一些概念和思想 Spring的核心:AOP.IOC. 简单点说,就是把对象交给Spring进行管理,通过面向切面编程来实现一些"模板式"的操作,使得程序员解放出来,可 ...
- Spring IOC 剖析
模拟实现 Spring Ioc 控制反转功能 使用 => 原理 => 源码 => 模拟实现 使用:了解 原理:熟悉 源码 And 模拟实现: 精通 对照 Spring 功能点 Spr ...
- 转 Spring源码剖析——核心IOC容器原理
Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...
- spring的核心组件及作用(一)
Spring的核心组件有: Context Core Bean. 如果要在这三个核心组件上挑出一个最核心的组件,那就是Bean组件了. Spring的特性功能有:WEB ORM AOP ...
- Jquery UI 组合树 - ComboTree 集成Wabacus4.1 代码剖析
Jquery UI 1.3 (组合树 - ComboTree ) 集成Wabacus4.1 集成Spring 代码剖析 使用时,请下载需要Jquery ui包进行配置 combotree.js 的代码 ...
- Spring初学
一.spring体系结构spring核心组件 1.Beans(包装应用程序自定义对象Object,Object中存有数据) 2.Core (资源加载,资源抽象,建立维护与bean之间的一些关系所需的一 ...
随机推荐
- ELK实时日志分析平台环境部署--完整记录
在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~ ==== ...
- zabbix监控交换机、防火墙等网络设备
zabbix3.4.4监控交换机/防火墙是非简单,只需知道交换机/防火墙的snmp密码,然后连接下自带或导入的snmp模板,就可以完成监控了.比如添加地址为172.10.11.5的交换机监控. 1)登 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 G. Spare Tire
这题很好啊,好在我没做出来...大概分析了一下,题目大概意思就是求 问所有满足1<=i<=n且i与m互素的ai之和 最开始我们队的做法是类似线性筛的方法去筛所有数,把数筛出来后剩下数即可, ...
- php的垃圾回收机制
转载请附上本文地址:http://blog.csdn.net/u011957758/article/details/76864400 前言 是的,平时经常听到大牛说到的gc,就是垃圾回收器,全称Gar ...
- Rabbit and Grass
链接 [http://acm.hdu.edu.cn/showproblem.php?pid=1849] 题意 大学时光是浪漫的,女生是浪漫的,圣诞更是浪漫的,但是Rabbit和Grass这两个大学女生 ...
- “耐撕团队”部署并测试onezero团队记帐本项目
耐撕团队 对onezero团队记帐本项目的部署并测试 测试指标参见下面给出的博客: http://www.ltesting.net/ceshi/ceshijishu/xncs/2014/1030/20 ...
- 【个人阅读】软件工程M1/M2做一个总结
1.以前博客链接 http://www.cnblogs.com/penglinjiang/p/4027850.html http://www.cnblogs.com/penglinjiang/p/40 ...
- 删除运行时权限不足,cmd开启管理员
管理员帐号活跃代码:net user administrator /active:yes 搜索cmd-右键以管理员身份运行 切换administrator帐号登录 操作后最后关闭这么高的权限,避免被非 ...
- 小学四则运算APP 第一个冲刺阶段 第六天
团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 本次发布的是重新排列整齐ResultActivity的布局代码activity_result. ...
- vue element-ui upload 实现带token上传
<el-upload class="upload-demo" :data ="uploadData" :headers = "headers&q ...