Spring框架的前世今生已及源码构建
本篇学习目标:
- 通过对本篇内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。
- 了解Spring的发展历史,启发思维。
- 对Spring形成一个整体的认识,为之后的深入学习做铺垫。
- 了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。
- 采用Gradle构建Spring5源码。
本篇内容定位:
Spring使用经验1-5年,希望深入了解Spring源码的人群。
一切从Bean开始:
Java Bean (Java Bean是由Applet Bean演变而来) ===> EJB(Enterprise Java Beans) ===> POJO (Plain Ordinary Java Object,简单的JavaBean)
Spring能够给我带来什么?
简化开发
Spring简化开发四个基本策略
- 基于POJO的轻量级和最小侵入性编程,POJO与POJO之间最小依赖。
- 通过依赖注入和面向接口松耦合。
- 基于切面和惯性进行声明式编程。
- 通过切面和模板减少样板式代码。
AOP、IOC、DI之间的依赖关系
DI ===>依赖于 IOC AOP ===>依赖于 IOC
建议看完这篇博客的Spring编程思想总结模块再来 地址:各设计模式总结与对比及Spring编程思想
Spring5模块结构图:
Spring之核心模块:
模块名称 | 主要功能 |
spring-core | 依赖注入IOC与DI的最基本实现 |
spring-beans | Bean工厂与Bean的装配 |
spring-context | 定义基础的Spring的Context上下文即IOC容器 |
spring-context-support | 对Spring IOC容器的扩展支持,以及IOC子容器 |
spring-context-indexer | Spring的类管理组件和Classpath扫描 |
spring-expression | Spring表达式语言 |
Spring之切面编程:
模块名称 | 主要功能 |
spring-aop | 面向切面编程的应用模块,整合Asm,CGLib,JDKProxy |
spring-aspects | 集成AspectJ(AOP应用框架) |
spring-instrument | 动态Class Loading模块 |
Spring之数据访问与集成:
模块名称 | 主要功能 |
spring-jdbc | Spring提供的JDBC抽象框架的主要实现模块,用于简化Spring JDBC操作 |
spring-tx | Spring JDBC事务控制实现模块 |
spring-orm | 主要集成Hibernate,Java Persistence API(JPA)和Java Data Objects(JDO) |
spring-oxm | 将Java对象映射成XML数据,或者将XML数据映射成Java对象 |
spring-jms | Java Messaging Service能够发送和接收信息 |
Spring之Web组件:
模块名称 | 主要功能 |
spring-web | 提供了最基础的Web支持,主要建立于核心容器之上,通过Servlet或者Listener来初始化IOC容器 |
spring-webmvc | 实现了Spring MVC(model-view-controller)的Web应用 |
spring-websocket | 主要是与Web前端的全双工通讯的协议 |
spring-webflux | 一个新的非堵塞函数式Reactive Web框架,可以用来建立异步的,非阻塞,事件驱动的服务(基于Servlet3.0才能使用) |
Spring之通信报文:
模块名称 | 主要功能 |
spring-messaging | 从Spring4开始新加入的一个模块,主要职责是为Spring框架集成一些基础的报文传送应用 |
Spring之集成测试:
模块名称 | 主要功能 |
spring-test | 主要为测试提供支持的 |
Spring之集成兼容:
模块名称 | 主要功能 |
spring-framework-bom | Bill of Materials 解决Spring不同模块依赖版本不同问题 |
Spring各模块之间的依赖关系:
常见的软件版本命名规则
软件 | 升级过程 | 说明 |
Linux Kernel | 0.0.1 1.0.0 2.6.32 3.0.18 ... | 若用X.Y.Z表示,则偶数Y表示稳定版本,奇数Y表示开发版本 |
Windows | Windows 98 Windows 2000 Windows XP Windows 7 | 最大的特点是杂乱无章,毫无规律。 |
SSH Client | 0.9.8 | |
OpenStack | 2014.1.3 2015.1.1.dev8 |
语义化版本命名通行规则
序号 | 格式要求 | 说明 |
X | 非负整数 | 表示主版本号(Major),当API的兼容性变化时,X需递增 |
Y | 非负整数 | 表示次版本号(Minor),当增加功能时(不影响API的兼容性),Y需递增 |
Z | 非负整数 | 表示修订号(Patch),当做Bug修复时(不影响API的兼容性),Z需递增 |
商业软件中常见的修饰词
描述方式 | 说明 | 含义 |
Snapshot | 快照版 | 尚不稳定、尚处于开发中的版本 |
Alpha | 内部版 | 严重缺陷基本完成修正并通过复测,但需要完整的功能测试 |
Beta | 测试版 | 相对alpha有很大改进,消除了严重的错误,但还是存在一些缺陷 |
RC | 终测版 | Release Candidate(最终测试),即将作为正式版发布。 |
Demo | 演示版 | 只集成了正式版部分功能升级,无法升级 |
SP | SP1 | 是service pack的意思表示升级包,相信大家还在windows中见过 |
Release | 稳定版 | 功能相对稳定,可以对外发行,但是有时间限制 |
Trial | 试用版 | 仅对部分用户发行 |
Full Version | 完整版 | 即正式版,已发布 |
Unregistered | 未注册 | 有功能或时间现在的版本 |
Standard | 标准版 | 能满足正常使用的功能版本 |
Lite | 精简版 | 只含有正式版的核心功能 |
Enhance | 增强版 | 正式版功能优化的版本 |
Ultimate | 旗舰版 | 在标配版本升级体验感更好的版本 |
Professiona | 专业版 | 针对更高要求功能,专业性能更强的使用群体发行的版本 |
Free | 自由版 | 自由免费使用的版本 |
Upgrade | 升级版 | 有功能增强或修复已知bug |
Retail | 零售版 | 单独发售 |
Cardware | 共享版 | 公用许可证(IOS签证) |
LTS | 维护版 | 该版本需要长期维护 |
Spring版本命名规则
描述方式 | 说明 | 含义 |
Snapshot | 快照版 | 尚不稳定、尚处于开发中的版本 |
Release | 稳定版 | 功能相对稳定,可以对外发行,但有时间限制 |
GA | 正式版 | 代表广泛可用的稳定版(General Availability) |
M | 里程碑版 | (M是Milestone的意思)具有一些全新的功能或是具有里程碑意义的版本 |
RC | 终测版 | Release Candidate(最终测试),即将作为正式版发布 |
Spring5源码构建教程
源码下载:spring-framework-5.0.2.RELEASE中文注释版地址
下载完成后,查看build.gradle文件,查看对应的gradle版本(gradleVersion = '4.3.1')
下载gradle:地址 选择对应的版本
配置环境变量:
配置下载jar位置(默认在用户目录下.gradle)
测试配置成功:
构建项目:
由于integration-0.9.15.jar已经不在仓库了,需要修改build.gradle文件
1 将id "org.jetbrains.dokka" version "0.9.15" 修改为id "org.jetbrains.dokka" version "0.9.17"
2 repositories中添加maven { url "https://plugins.gradle.org/m2/" },问题解决了,可以下载新版本的jar
在指定工程文件夹下运行命令:
在spring项目中找到import-into-idea.md
文件,打开后跟着step操作。
导入步骤
idea版本:IntelliJ IDEA 2020.1
导入(其他低版本选择import导入)
这里第一次导入时可能需要手动停止,然后去设置这个idea的gradle本地仓库,不然又直接下载到c盘去了,顶不住😮,还有本地的gradle,不然idea要自己去下载了🐷
成功的话可以看到下图啦
接着连按两次shift
键,找到ApplicationContext
类,并按ctrl+shift+alt+u
,看到下图也表示成功啦😋