Spring源码解读(一):Spring的背景起源及框架整体介绍
一、前言
Spring起源于2002年Rod Johnson写的一本书《Expert One-on-One J2EE》,书里介绍了Java企业应用程序开发情况,并指出Java EE和EJB组件框架中的一些主要缺陷,还提出了一个基于普通的Java类和依赖注入的更简单的解决方案。在书中,他展示了如何在不使用EJB的情况下构建高质量、可扩展性的在线预留座位系统。为构建应用程序,他编写了超过30,000行的基础结构代码,项目中的根包命名为com.interface21,这是Spring的前身,所以框架最初的名字叫interface21。
2003 年 Rod Johnson 和同伴在此框架的基础上开发了一个全新的框架命名为 Spring,据 Rod Johnson 介绍 Spring 是传统 J2EE 新的开始,随后 Spring 发展进入快车道。
二、Spring 5.x 的模块组成
Spring Framework由大约20个模块组成的功能组成。这些模块分为核心容器,数据访问/集成,Web,AOP(面向切面编程),Instrumentation,消息传递和测试,如下图所示

1、Spring核心容器由spring-core, spring-beans,spring-context,spring-context-support,和spring-expression(Spring表达式语言)模块。
spring-core和spring-beans模块提供框架的基础部件,包括IOC和依赖注入特征。
上下文(spring-context)模块建立在core和beans模块基础之上的。context模块从beans模块继承其功能,并添加对国际化(例如,使用资源包),事件传播,资源加载以及通过,例如Servlet容器透明创建上下文的支持,还支持Java EE功能,例如EJB,JMX和基本远程处理。spring-context-support 提供对将常见的第三方库集成到Spring应用程序上下文中的支持,特别是对于缓存(EhCache,JCache)和调度(CommonJ,Quartz)。
spring-expression模块提供了一种功能强大的表达式语言,用于在运行时查询和操作对象图。它是JSP 2.1规范中指定的统一表达式语言(统一EL)的扩展。该语言支持设置和获取属性值,属性赋值,方法调用,访问数组,集合和索引器的内容,逻辑和算术运算符,命名变量以及从Spring的IoC容器中按名称检索对象。它还支持列表投影和选择以及常用列表聚合。
spring-aop模块提供了一个符合AOP Alliance标准的面向方面的编程实现,允许您定义,例如,方法拦截器和切入点,以干净地解耦实现应该分离的功能的代码。使用源级元数据功能,您还可以以类似于.NET属性的方式将行为信息合并到代码中。
单独的spring-aspects模块提供与AspectJ的集成。
spring-instrument模块提供了在某些应用程序服务器中使用的类检测支持和类加载器实现。
spring-messaging从关键抽象模块 Spring集成项目,例如Message,MessageChannel,MessageHandler,和其他人作为基于消息的应用奠定了基础。
2、数据访问/集成层由JDBC,ORM,OXM,JMS和事务模块组成。
spring-jdbc模块提供了一个JDBC抽象层,无需进行繁琐的JDBC编码和解析数据库供应商特定的错误代码。
spring-tx模块支持对实现特殊接口的类和所有POJO的类进行编程和声明式事务管理。
spring-orm模块为流行的对象关系映射API提供了集成层,包括JPA和Hibernate。使用spring-orm模块,您可以将这些O / R映射框架与Spring提供的所有其他功能结合使用,例如前面提到的简单声明式事务管理功能。
spring-oxm模块提供了一个抽象层,支持对象/ XML映射实现,如JAXB,Castor,JiBX和XStream。
spring-jms模块(Java Messaging Service)包含用于生成和使用消息的功能。 从Spring Framework 4.1开始,它提供了与spring-messaging模块的集成。
3、Web层由spring-web,spring-webmvc和spring-websocket模块组成。
spring-web模块提供基本的面向Web的集成功能,例如多部分文件上载功能以及使用Servlet侦听器和面向Web的应用程序上下文初始化IoC容器。 它还包含一个HTTP客户端以及Spring的远程支持的Web相关部分。
spring-webmvc模块(也称为Web-Servlet模块)包含Spring的模型 - 视图 - 控制器(MVC)和用于Web应用程序的REST Web服务实现。 Spring的MVC框架提供了域模型代码和Web表单之间的清晰分离,并与Spring Framework的所有其他功能集成在一起。
4、Spring测试模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。 它提供Spring ApplicationContexts的一致加载和这些上下文的缓存。 它还提供了可用于独立测试代码的模拟对象。
使用场景:
1、典型的完整Spring Web应用程序

2、使用第三方Web框架的Spring中间层

3、Remoting使用场景

4、EJB - 包装现有的POJO

以上说明来源于Spring官方文档。
以下是SpringFramework的所有模块:

Spring源码解读(一):Spring的背景起源及框架整体介绍的更多相关文章
- Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring源码-AOP部分-Spring是如何对bean实现AOP代理的
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 历史文章 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] S ...
- Spring源码解读之BeanFactoryPostProcessor的处理
前言 前段时间旁听了某课堂两节Spring源码解析课,刚好最近自己又在重新学习中,便在这里记录一下学习所得.我之前写过一篇博文,是介绍BeanFactoryPostProcessor跟BeanPost ...
- Spring源码解读--(一)源码下载
走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...
- 【Spring源码解读】bean标签中的属性
说明 今天在阅读Spring源码的时候,发现在加载xml中的bean时,解析了很多标签,其中有常用的如:scope.autowire.lazy-init.init-method.destroy-met ...
- Spring源码解读:核心类DefaultListableBeanFactory的继承体系
1 简介 我们常用的ClassPathXmlApplicationContext是AbstractRefreshableApplicationContext的子类,而DefaultListableBe ...
- 框架源码系列六:Spring源码学习之Spring IOC源码学习
Spring 源码学习过程: 一.搞明白IOC能做什么,是怎么做的 1. 搞明白IOC能做什么? IOC是用为用户创建.管理实例对象的.用户需要实例对象时只需要向IOC容器获取就行了,不用自己去创建 ...
- spring源码深度解析—Spring的整体架构和环境搭建
概述 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Java 开发框 ...
- spring源码学习(三)--spring循环引用源码学习
在spring中,是支持单实例bean的循环引用(循环依赖)的,循环依赖,简单而言,就是A类中注入了B类,B类中注入了A类,首先贴出我的代码示例 @Component public class Add ...
随机推荐
- Fastjson反序列化漏洞基础
Fastjson反序列化漏洞基础 FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象. 0x0 ...
- 如何解决浮动元素高度塌陷---CSS
解决高度塌陷问题的方法: 方法一. //给父元素添加声明 overflow:hidden; 缺点:回隐藏溢出的元素: 方法二. 在浮动的元素下添加空div标签,并给该元素添加声明: clear:bot ...
- zip命令常用选项
大家都知道,在linux上一切皆文件,在实际生产环境中,如果我们需要部署一些系统的服务,我们会将一些软件包提前下载下来统一放到一个文件夹中, 然后将部署的过程用shell或者python写成一个脚本, ...
- 在FLASH中读写结构体
在FLASH中读写结构体 注意事项 编程(写数据)地址要对齐 写数据时,我们要指定写入的地址,如果写入地址为非对齐,则会出现编程对齐错误. 比如遵循32位(4字节)地址对齐,你的地址只能是4的倍数.0 ...
- 修改文件权限后,再git pull后提示文件已修改
问题: 从git上面pull下来脚本文件,在Linux上面执行.执行chmod +x 后,如果再次有修改文件,git pull 的提示会终止.每次都要使用 git checkout -- <fi ...
- 浏览器缓存旧的js文件或css文件导致没出现预期效果
最好在加载的js或css文件后加上 ?v=1.0.0 版本号,更新js后就更改一下版本号即可
- Docker系列(3)- 配置阿里云镜像加速
step-1 登录阿里云找到容器服务 step-2 找到镜像加速地址 step-3 配置使用 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon ...
- Groovy系列(1)- Groovy简述
Groovy简述 前言 由于性能测试的JSR223 Sampler取样器需要用到 Groovy 语言,这两天对其进行了粗略的学习,本文是对学习做的一个简单总结,主要内容参考于官方文档(Groovy 的 ...
- Shell系列(31)- 双分支if语句简介
双分支if条件语句 if [ 条件判断式 ] then 条件成立,执行的程序 else 条件不成立,执行的程序 fi 需求 根据用户输入的目录名,判断是否存在 脚本: #!/bin/bash #使用r ...
- pycharm 操作excel
一.安装openpyxl Python中,往excel写入数据通常使用openpyxl库.也可以使用pandas库.这里讲解如何通过openpyxl库操作excel.pip install openp ...