# spring-framework-beta **Repository Path**: wondream/spring-framework-beta ## Basic Information - **Project Name**: spring-framework-beta - **Description**: spring-framework 5.3 源码分析 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2022-10-29 - **Last Updated**: 2022-10-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Framework-5.3.x [![Build Status](https://ci.spring.io/api/v1/teams/spring-framework/pipelines/spring-framework-5.3.x/jobs/build/badge)](https://ci.spring.io/teams/spring-framework/pipelines/spring-framework-5.3.x?groups=Build") [官方README.md](https://github.com/spring-projects/spring-framework/blob/master/README.md) - [1 前言](#1-前言) - [2 环境准备](#2-环境准备) - [2.1 Git 版本控制工具(先`fork`,再`clone`源码)](#21-git-版本控制工具先fork再clone源码) - [2.2 JDK8及以上(java基础工具包及运行环境)](#22-jdk8及以上java基础工具包及运行环境) - [2.3 Gradle-6.5.1 工程构建工具(根据源码确定)](#23-gradle-651-工程构建工具根据源码确定) - [2.4 我使用的环境](#24-我使用的环境) - [2.5 IDEA2019.2.x 及以上版本](#25-idea20192x-及以上版本) - [3 开始构建(保持网络流畅)](#3-开始构建保持网络流畅) - [3.1 直接将源码导入IDEA中](#31-直接将源码导入idea中) - [3.2 设置Gradle](#32-设置gradle) - [3.3 配置gradle-wrapper.properties文件](#33-配置gradle-wrapperproperties文件) - [3.4 配置build.gradle文件](#34-配置buildgradle文件) - [3.5 构建成功验证](#35-构建成功验证) - [4 编译源码](#4-编译源码) - [4.1 查看官方import-into-idea.md文档](#41-查看官方import-into-ideamd文档) - [4.2 先编译spring-oxm模块](#42-先编译spring-oxm模块) - [4.3 再编译spring-core模块,同上](#43-再编译spring-core模块同上) - [4.4 都编译完成且成功之后,开始编译整个工程](#44-都编译完成且成功之后开始编译整个工程) - [5 源码测试](#5-源码测试) - [5.1 步骤](#51-步骤) - [5.2 在Spring工程中添加自己的module模块](#52-在spring工程中添加自己的module模块) - [5.3 引用`spring-conetxt`模块](#53-引用spring-conetxt模块) - [6 Spring-Framework 各个模块的作用](#6-spring-framework-各个模块的作用) # 1 前言 **有的人按照其他人的教程编译的一遍,别人成功了,你却没有成功,不要查百度,90%的原因是因为你的版本没有保持一致。所有环境配置好了,基本都可以一次性成功。** **编译源码最重要的就是环境问题,一定要确保版本的一致性,就可以一次性编译成功!!!** **编译源码最重要的就是环境问题,一定要确保版本的一致性,就可以一次性编译成功!!!** **编译源码最重要的就是环境问题,一定要确保版本的一致性,就可以一次性编译成功!!!** 当前最新版spring5.3.x的源码构建过程,由于构建工具采用gradle(spring团队已经抛弃maven构建,全面拥抱gradle了) *** # 2 环境准备 ## 2.1 Git 版本控制工具(先`fork`,再`clone`源码) **注意**:如果你想要一份属于自己的spring源码,请先`fork`到自己的仓库,调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交 * [Github原始仓库](https://github.com/spring-projects/spring-framework) * [Gitee镜像仓库](https://gitee.com/mirrors/Spring-Framework) > `git` `clone` Github仓库的源码比较慢,除非使用梯子,你懂的`~` > > 建议`clone` Gitee 镜像仓库的源码,此仓库是为了提升国内下载速度的镜像仓库,每日同步一次 > ## 2.2 JDK8及以上(java基础工具包及运行环境) [JDK8u261](https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html) 可以选择自己的JDK版本,官网现在要求的版本是 **1.8及以上版本** ## 2.3 Gradle-6.5.1 工程构建工具(根据源码确定) * [Gradle官方](https://gradle.org/releases/) * [Gradle镜像](https://services.gradle.org/distributions/) > 根据版本确定你自己下载的,官网上的版本比较全,找不到去官网找,spring5.3.x 使用的是Gradle6.5.1 版本(gradle-6.5.1-all.zip【all版本是带源码的】) > 如果你是从Maven迁移过来的,可以使用Maven本地仓库 ``` # 环境变量配置GRADLE_USER_HOME GRADLE_USER_HOME=C:\Users\用户名\.m2\repository # Gradle 项目根目录下的 build.gradle文件 repositories { // 先从本地仓库找 mavenLocal() // 表示使用中央仓库 mavenCentral() } # gradle默认存放jar路径 C:\Users\用户名\.gradle\caches\modules-2\files-2.1 ``` ## 2.4 我使用的环境 ![UBvnG8.png](https://images.gitee.com/uploads/images/2020/0716/170427_66af8e6b_5424513.png) ## 2.5 IDEA2019.2.x 及以上版本 **IDEA的Gradle 插件问题:** IDEA2019.2 之前 导入Gradle项目时,有Gradle版本选择和Gradle相关配置; IDEA2019.2.x 及以上版本,不给机会了,哈哈,导入Gradle项目后,没有了Gradle版本选择,只有Gradle相关配置。 *** # 3 开始构建(保持网络流畅) > 保持网络流畅,便于下载需要的依赖文件,构建过程就是找依赖对象的过程 ## 3.1 直接将源码导入IDEA中 ## 3.2 设置Gradle > 导入项目之后,【File】->【Settings】,设置Gradle Gradle user home这个目录是设置的安装的gradle目录。如果不设置的话,它默认是C:\Users\用户名\.gradle,这个目录你就可以认为相当于是我们的本地的maven仓库,gradle编译项目所依赖的jar都会下载后放入这个目录中。jvm默认我这里就是jdk8,jdk至少就是jdk8。 [![UDPojK.png](https://images.gitee.com/uploads/images/2020/0716/170427_89b19193_5424513.png)](https://imgchr.com/i/UDPojK) ## 3.3 配置gradle-wrapper.properties文件 > 设置完毕之后,打开工程下的gradle目录->wrapper目录下的,gradle-wrapper.properties文件 因为gradle每次编译都会从官网下载指定版本(gradle-6.5.1-all.zip),所以我们在它第一次下载完之后,将distributionUrl设置成本地文件,这样就不会每次编译都从官网下载了。 gradle-6.5.1-all.zip文件保存位置:gradle目录/wrapper/dists ``` #distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip # 将distributionUrl 设置为本地文件,避免gradle每次编译都从网上下载(注意盘符要小写,不然会报错) distributionUrl=file:///e:/gradle/gradle-6.5.1/wrapper/dists/gradle-6.5.1-bin/1m5048aptkfynhbvolwgr4ej9/gradle-6.5.1-bin.zip ``` ![UDmdN8.png](https://images.gitee.com/uploads/images/2020/0716/170428_77b69fe7_5424513.png) ## 3.4 配置build.gradle文件 > 打开工程根目录下的 build.gradle文件(这个就相当于是maven的pom文件) 添加添加本地Maven仓库和阿里云镜像,目的就是加快依赖包的下载速度,如果不配置镜像的话,可能会编译几个小时。 ``` repositories { // 先从本地仓库中找 mavenLocal() // 阿里云镜像 maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' } } ``` [![UDuj6H.png](https://images.gitee.com/uploads/images/2020/0716/170429_e3bb6dfa_5424513.png)](https://imgchr.com/i/UDuj6H) 等待一定时间后(我用了大概5分钟左右),构建完毕! (注意:这里只是把依赖包下载下来,其实还没有真正开始编译) 如果构建失败,重新刷新Gradle插件几次就行了,一般就是包下载超时之类的错误。 ## 3.5 构建成功验证 > 构建成功之后,找到`ApplicationContext`接口,打开 打开后,按下Ctrl+Alt+U键,如果出现下图所示类图界面说明构建成功了!(构建过程就是找依赖对象的过程) ![UDQX1U.png](https://images.gitee.com/uploads/images/2020/0716/170433_d1f40b43_5424513.png) 在构建完成源码之后,就搭建好了阅读源码的环境了,此时我们还需要将源码编译打包。 *** # 4 编译源码 > 我们需要在源码的基础上面进行修改,开发,调试,添加注释等等操作,所以需要将源码进行编译打包,下面就是将源码编译的过程 ## 4.1 查看官方import-into-idea.md文档 [import-into-idea.md](https://github.com/spring-projects/spring-framework/blob/master/import-into-idea.md) 在编译之前需要进行一些配置修改,可以查看import-into-idea.md文档(与build.gradle 在同一级目录下) 大致意思如下: * 先编译spring-oxm下的compileTestjava * 再编译下spring-core模块,同上 * 从工程中移除spring-aspects模块(remove即可,别delete) * 都编译完成且成功之后,可以开始编译整个工程(这个过程非常耗时间,可能10-20分钟!) ## 4.2 先编译spring-oxm模块 > 先编译spring-oxm下的compileTestjava,点击右上角gradle打开编译视图,找到spring-oxm模块,然后在other下找到compileTestjava,双击即可! ![UDYVjf.png](https://images.gitee.com/uploads/images/2020/0716/170431_64cc4930_5424513.png) ## 4.3 再编译spring-core模块,同上 ![UDYrgx.png](https://images.gitee.com/uploads/images/2020/0716/170430_5e291ef7_5424513.png) ## 4.4 都编译完成且成功之后,开始编译整个工程 > 打开右侧Gradle插件 spring->build->build > 编译时间,每个人电脑的性能不一样,所需时间也不一样 ![UDt1de.png](https://images.gitee.com/uploads/images/2020/0716/170432_49f3fe08_5424513.png) ![UDNSFH.png](https://images.gitee.com/uploads/images/2020/0716/170432_8bd9b251_5424513.png) *** # 5 源码测试 > 构建成功了,源码编译成功了,能否用还不知道,还要测试通过才说明源码可以用了 编写一个简单的`applicationContext`获取容器中的bean ## 5.1 步骤 * 在Spring工程中添加自己的module模块,选择gradle构建类型为java的项目 * 在自己的模块中,引入 `spring-conetxt` 模块(自己模块的build.gradle 文件中配置) * 编写代码 [代码参考](https://gitee.com/TANGMONK-MEAT/spring-framework/tree/master/spring-source-dev) ## 5.2 在Spring工程中添加自己的module模块 ![UDBEmq.png](https://images.gitee.com/uploads/images/2020/0716/170433_ea02549b_5424513.png) ## 5.3 引用`spring-conetxt`模块 > 引入了哪些模块,才可以使用对应的API和功能 ``` // 在自己模块的build.gradle 文件中 dependencies { // 自己引用的模块 compile(project(":spring-context")) // 默认生成的 testCompile group: 'junit', name: 'junit', version: '4.12' } ``` *** # 6 Spring-Framework 各个模块的作用 主要模块 spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 spring-context-indexer:类管理组件和Classpath扫描 spring-expression:表达式语句 切面编程 spring-aop:面向切面编程,CGLIB,JDKProxy spring-aspects:集成AspectJ,Aop应用框架 spring-instrument:动态Class Loading模块 数据访问与集成 spring-jdbc:提供JDBC主要实现模块,用于简化JDBC操作 spring-tx:spring-jdbc事务管理 spring-orm:主要集成Hibernate,jpa,jdo等 spring-oxm:将java对象映射成xml数据或将xml映射为java对象 spring-jms:发送和接受消息 web组件 spring-web:提供了最基础的web支持,主要建立在核心容器上 spring-webmvc:实现了spring mvc的web应用 spring-websocket:主要与前端页的全双工通讯协议 spring-webflux:一个新的非阻塞函数式Reactive Web框架 报文 spring-messaging:4.0加入的模块,主要集成基础报文传送应用 测试 spring-test:测试组件 集成兼容 spring-framework-bom:解决不同模块依赖版本不同问题