Spring Framework(6.x)源码编译与源码阅读入门

目录

一、Spring Framework 源码获取问题

1.1 Spring Framework 官网

1.2 Spring Framework 源码地址

1.3 关于访问不了GitHub 官网的解决方案

1.3.1 修改本地hosts文件

1.3.2 GitHub520

1.3.3 Gitee 导入

二、Spring Framework 源码编译

2.1 环境说明

2.1.1 JDK版本

2.1.2 Gradle 版本

2.1.2.1 Gradle 安装

2.1.2.1.1 下载

2.1.2.1.2 环境变量配置

2.1.2.1.3 版本查看

2.1.2.1.4 配置镜像仓库

2.2 源码编译

2.2.1 配置build.gradle

2.2.2 配置 settings.gradle

2.2.3 配置gradle下载地址

2.2.4 预编译spring-oxm

2.2.5 导入工程

2.2.6 修改spring-aspects工程

2.3 测试

2.3.1 新增测试模块

2.3.2 添加依赖

2.3.3 测试代码

2.3.4 测试结果

三、Spring Framework 源码结构说明

3.1 整体架构

3.1.1 整体架构图

3.2 模块介绍

3.2.1 spring-aop

3.2.2 spring-aspects

3.2.3 spring-beans

3.2.4 spring-context

3.2.5 spring-context-indexer

3.2.6 spring-context-support

3.2.7 spring-core

3.2.8 spring-expression

3.2.9 spring-framework-bom

3.2.10 spring-instrument

3.2.11 spring-jcl

3.2.12 spring-jdbc

3.2.13 spring-jms

3.2.14 spring-messaging

3.2.15 spring-orm

3.2.16 spring-oxm

3.2.17 spring-test

3.2.18 spring-tx

3.2.19 spring-web

3.2.20 spring-webflux

3.2.21 spring-webmvc

3.2.22 spring-websocket


一、Spring Framework 源码获取问题

1.1 Spring Framework 官网

这里主要是解决有的小伙伴可能不知道源码在哪下载的问题,所以这里我给出Spring Framework 的官网

地址如下:

Spring Framework

1.2 Spring Framework 源码地址

我们访问到了Spring 的官网,查看到了Spring Framework 相关版本信息,但是我们去哪里下载源码呢,

其实很容易获取到,就在官网的右上角,如下图:

点击一下这里,就会跳转到Spring Framework GitHub 源码网页,这里也给出下源码的地址吧,如下:

GitHub - spring-projects/spring-framework: Spring Framework

1.3 关于访问不了GitHub 官网的解决方案

好多小伙伴反馈,自己的网络访问不到GitHub 官网,害,白忙活,还是没能拿到Spring Framework的源码,那么,我们有没有什么方法能解决这个问题呢,答案是肯定的,下面我介绍几种方法,保证让你成功拿到GitHub 上的源码,嘿嘿,来吧!

1.3.1 修改本地hosts文件

我们在浏览器输入 GitHub 的网址时,会向 DNS 服务器发送一个请求,获取到 GitHub 网站所在的服务器 IP 地址,从而进行访问。

就像你是一名快递员,在送快递前要先找中间人询问收件人的地址。而 DNS 就是这个告诉你目标地址的中间人,如果 DNS 告诉了你错误的地址、或者请求被拦截、再或者 DNS 挂了,都会导致你无法访问网站。

那有什么办法不经过 DNS,就获取到网址对应的 IP 么?

答案就是修改 `hosts` 文件。

当用户在浏览器中输入网址时,系统会首先自动从 hosts 文件中寻找对应的 IP 地址,一旦找到,系统会立即打开对应网页,如果没有找到,系统才会再将网址提交 DNS 域名解析服务器进行 IP 地址的解析。

因此,想要访问 GitHub,我们可以先通过 IP 查询工具 来获取当前 GitHub 网站的真实地址,再修改本地 hosts 文件,将该地址和 GitHub 网址关联。

先找到 hosts 文件的位置,不同操作系统,hosts 文件的存储位置也不同:

  • Windows 系统:
C:\Windows\System32\drivers\etc\hosts
  • Linux 系统:
/etc/hosts
  • Mac(苹果电脑)系统:
/etc/hosts

打开 hosts 文件,添加一行,将 xx 替换为你查询到的解析地址即可:

20.205.243.166 www.github.com

但这种方式比较麻烦,而且查询出来的 IP 也未必支持国内的访问,所以下面再推荐另外一种更简单的方式!

注意:要保证你的宽带网络支持外网,现在一般的家庭带宽都是国内网络,不支持访问国外ip的,所以能访问外网这个是前提!!!

1.3.2 GitHub520

GitHub520 就是一个帮助大家访问 GitHub 的项目,本质也是通过修改 hosts 来实现的。该项目的作者为大家提供了一份完整的 hosts 列表,无需大家自己查询可用 IP,非常地贴心,而且每天都会更新!

可以自己搜索下,这里我就不多说了。

注意:要保证你的宽带网络支持外网,现在一般的家庭带宽都是国内网络,不支持访问国外ip的,所以能访问外网这个是前提!!!

1.3.3 Gitee 导入

Gitee 是国内版的 GitHub,支持在新建项目时直接导入已有的 GitHub 仓库。想要下载哪个项目的源码,直接输入对应的 GitHub 仓库地址即可!

这种方式,就是应对1.3.1、1.3.2以上两种方式都行不通的情况下的绝招!特别是国内普通家庭宽带网络访问不了外网的这种情况。

然后填入github项目地址

可以看到,已经导入成功了,通过这样的方式也能拿到Spring Framework项目的源码。

二、Spring Framework 源码编译

2.1 环境说明

2.1.1 JDK版本

Spring Framework 6.x版本的编译,JDK需要安装JDK17版本,具体的JDK环境安装和环境变量配置,这里就不多说了,作为Java开发人员,应当是必备的技能。

2.1.2 Gradle 版本

Spring Framework 6.x 版本依赖管理使用的是Gradle,因此,在编译前,需要安装Gradle,下载相关依赖包。

2.1.2.1 Gradle 安装
2.1.2.1.1 下载

官网下载地址:Gradle | Releases

2.1.2.1.2 环境变量配置

2.1.2.1.3 版本查看

2.1.2.1.4 配置镜像仓库

2.2 源码编译

2.2.1 配置build.gradle

# 新增,阿里依赖源
maven { url 'https://maven.aliyun.com/repository/public' }

2.2.2 配置 settings.gradle

# 新增,阿里依赖源
maven { url 'https://maven.aliyun.com/repository/public' }

2.2.3 配置gradle下载地址

修改gradle-wrapper.properties 配置,把distributionUrl修改成本地地址,因为第一次运行就会去下载 `gradle` 到本地,然后通过 `gradle` 来编译 `Spring` 源码。外网服务器下载,你懂得,有被墙的风险,并且本身也很慢。

2.2.4 预编译spring-oxm

根据官网文档来编译就行,或者查看源码工程的import-into-idea.md说明文档

./gradlew :spring-oxm:compileTestJava

2.2.5 导入工程

File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle

2.2.6 修改spring-aspects工程

When prompted exclude the `spring-aspects` module (or after the import via File-> Project Structure -> Modules)

2.3 测试

2.3.1 新增测试模块

2.3.2 添加依赖

build.gradle 文件,新增spring-context模块依赖,该模块包含了spring-core和spring-bean 、IOC容器等Spring 运行时上下文依赖内容,具体如下:

plugins {id 'java'
}group 'org.springframework'
version '1.0-SNAPSHOT'repositories {maven { url 'https://maven.aliyun.com/repository/public' }mavenCentral()
}dependencies {api(project(":sprting-context"))testImplementation'org.junit.jupiter:junit-jupiter-api:5.8.1'testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1")
}test {useJUnitPlatform()
}

2.3.3 测试代码

package com.ningzhaosheng.spring.sample.service;/*** @author ningzhaosheng* @date 2024/1/29 21:33:18* @description*/
public interface IPersonService {void speak();
}
package com.ningzhaosheng.spring.sample.service.impl;import com.ningzhaosheng.spring.sample.service.IPersonService;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;/*** @author ningzhaosheng* @date 2024/1/29 21:34:20* @description*/
@Service
@Primary
public class ChineseService implements IPersonService {@Overridepublic void speak() {System.out.println("我会说中文");}
}
package com.ningzhaosheng.spring.sample.service.impl;import com.ningzhaosheng.spring.sample.service.IPersonService;
import org.springframework.stereotype.Service;/*** @author ningzhaosheng* @date 2024/1/29 21:37:46* @description*/
@Service
public class EnglishService implements IPersonService {@Overridepublic void speak() {System.out.println("I can speak English");}
}
package com.ningzhaosheng.spring.sample;import com.ningzhaosheng.spring.sample.service.IPersonService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;/*** @author ningzhaosheng* @date 2024/1/29 21:39:21* @description*/
@ComponentScan("com.ningzhaosheng.spring.sample.**")
public class SpringSampleApplication {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringSampleApplication.class);IPersonService personService = context.getBean(IPersonService.class);personService.speak();}
}

2.3.4 测试结果

从以上测试结果,我们可以发现,运行成功。源码编译成功。

三、Spring Framework 源码结构说明

3.1 整体架构

3.1.1 整体架构图

Spring框架是一种分层架构,它包含了一系列的功能,大概由20种模块组成。 这些模块分为核心容器(Core Container),数据访问/集成(Data Access/Integration), Web,AOP,工具(Instrumentation), 消息(Messaging), 测试用例(Test)。

3.2 模块介绍

按照 Spring 的源码结构依次介绍

3.2.1 spring-aop

面向切面编程时使用。Spring通过"横切"的方式将贯穿于多业务中的公共功能独立抽取出来,形成单独的切面,并指定切面的具体动作,在需要使用该功能时,动态地将该功能切入到需要的地方。

3.2.2 spring-aspects

用来实现AspectJ框架的集成。而AspectJ是一个通过对java扩展出之后的框架,框架里面定义了AOP的语法,通过特殊的编译器完成编译期间的代码织入,最后生成增强之后的Class文件。

3.2.3 spring-beans

完成Spring框架的基本功能,里面定义了大量和Bean有关的接口,类及注解。例如:bean定义的顶层接口BeanDefinition、bean装配相关的注解Autowired/Qualifier/Value、用来创建bean的工厂接口BeanFactory及一些具体的工厂方法等。

3.2.4 spring-context

用来实现Spring上下文功能,及Spring的IOC,例如初始化Spring容器时所使用的ApplicationContext接口及常用的抽象实现类AnnotationConfigApplicatoinContext或者ClasspathXmlApplicationContext等。

3.2.5 spring-context-indexer

用来创建Spring应用启动时候选组件的索引,以提高应用的启动速度。通常情况下,应用启动的时候会去扫描类路径下的所有组件,但是如果组件特别多,会导致应用启动特别缓慢。该模块可以在应用的编译器对应用的类路径下的组件创建索引,在启动的时候通过索引去加载和初始化组件,可以大大提升应用启动的速度。

3.2.6 spring-context-support

用来提供Spring上下文的一些扩展模块,例如实现邮件服务、视图解析、缓存(定义了对下面几种缓存的支持:caffeine,ehcache,jcache)、定时任务调度等。

3.2.7 spring-core

Spring的核心功能实现,例如:控制反转(IOC)、依赖注入(DI)、asm以及cglib的实现。

3.2.8 spring-expression

提供Spring表达式语言的支持,SPEL。

3.2.9 spring-framework-bom

通过该模块,可以解决Spring中的模块与其他框架整合时产生jar包版本的冲突,默认为空实现。

3.2.10 spring-instrument

实现Spring对服务器的代理接口功能实现,实现的是类级别或者ClassLoader级别的代理功能。

3.2.11 spring-jcl

通过适配器设计模式实现的一个用来统一管理日志的框架,对外体统统一的接口,采用"适配器类"将日志的操作全部委托给具体的日志框架,提供了对多种日志框架的支持。

3.2.12 spring-jdbc

Spring对JDBC(Java Data Base Connector)功能的支持,里面定义了用于操作数据的多种API,常用的即:JdbcTemplate,通过模板设计模式将数据库的操作和具体业务分离,降低了数据库操作和业务功能的耦合。

3.2.13 spring-jms

对Java消息服务的支持,对JDK中的JMS API进行了简单的封装。

3.2.14 spring-messaging

实现基于消息来构建服务的功能。

3.2.15 spring-orm

提供了一些整合第三方ORM框架的抽象接口,用来支持与第三方ORM框架进行整合,例如:MyBatis,Hibernate,Spring JPA等。

3.2.16 spring-oxm

Spring用来对对象和xml(Object/xml)映射的支持,完成xml和object对象的相互转换。

3.2.17 spring-test

Spring对Junit测试框架的简单封装,用来快速构建应用的单元测试功能及Mock测试。

3.2.18 spring-tx

Spring对一些数据访问框架提供的声明式事务或者编程式事务(通过配置文件进行事务的声明)的支持。例如:Hibernate,MyBatis,JPA等。

3.2.19 spring-web

用来支持Web系统的功能。例如:文件上传,与JSF的集成,过滤器Filter的支持等。

3.2.20 spring-webflux

Spring5中新增的一个通过响应式编程来实现web功能的框架。内部支持了reactive和非阻塞式的功能,例如可以通过tcp的长连接来实现数据传输。webmvc的升级版,webmvc是基于servlet的,而webflux是基于reactive的。

3.2.21 spring-webmvc

用来支持SpringMVC的功能,包括了和SpringMVC框架相关的所有类或者接口,例如常用的DispatcherServlet、ModelAndView、HandlerAdaptor等。另外提供了支持国际化、标签、主题、FreeMarker、Velocity、XSLT的相关类。注意:如果使用了其他类似于smart-framework的独立MVC框架,则不需要使用该模块中的任何类。

3.2.22 spring-websocket

Spring对websocket的简单封装,提供了及时通信的功能,常用于一些即时通讯功能的开发,例如:聊天室。

好了,本次内容就分享到这,后续可能会整理书写相关Spring源码的文章,欢迎关注本博主。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/449125.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过WSL2来实现Windows10/11的深度学习模型GPU加速,TensorFlow项,Jupyter及其插件安装,CQF心得,金融量化

通过WSL2来实现TF的GPU加速 为什么要用WSL(Windows Subsystem Linux)安装WSL2,miniconda,cuda,cudnn,TA-Lib安装 WSL2安装 Miniconda3安装 CUDA安装 cuDNN安装 TensorFlow 库安装 TA-Lib 库安装其它CQF及金…

阿里云a10GPU,centos7,cuda11.2环境配置

Anaconda3-2022.05-Linux-x86_64.sh gcc升级 centos7升级gcc至8.2_centos7 yum gcc8.2.0-CSDN博客 paddlepaddle python -m pip install paddlepaddle-gpu2.5.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html 报错 ImportError: libssl.so…

解锁影视制作新境界:DaVinci Resolve Studio 18引领行业变革

随着科技的不断发展,影视制作行业也在日新月异地变革。在这一进程中,DaVinci Resolve Studio 18以其卓越的性能和无限的创新力,成为了行业的领跑者。 DaVinci Resolve Studio 18是一款集剪辑、调色、音频处理和特效合成于一身的专业级影视制…

虚幻UE5Matehuman定制自己的虚拟人,从相机拍照到UE5制作全流程

开启自己的元宇宙,照片扫描真实的人类,生成虚拟形象,保姆级教程,欢迎大家指正。 需要的软件: 制作流程: 一.拍照。 围绕自己拍照,大概20多张图就差不多了,把脑门漏出来,无需拍后脑勺。 拍照方式 例如,拍照时尽量不要在脸上体现出明显的光源方向。

【Springcloud篇】学习笔记一(一至三章):微服务介绍、构建环境

零基础微服务架构理论入门介绍 一个基于分布式的服务架构应该含有的架构内容如下: 1.1SpringCloud是什么 1.2基于微服务的系统 1.3服务与之对用的技术 1.4课程目录 第一章_SpringBoot和SpringCloud版本选择 详细可见SpringCloud2020.mmap文件 1.概述 2.SpringBoo…

python 基础知识点(蓝桥杯python科目个人复习计划32)

今日复习内容:基础算法中的位运算 1.简介 位运算就是对二进制进行操作的运算方式,分为与运算,或运算,异或运算,取反,左移和右移。 (1)与运算 xyx&y000010100111 (2)或运算 …

用Python和 Cryptography库给你的文件加密解密

用Python和 Cryptography库给你的文件加密解密 用Python和 Cryptography库给你的文件加把安全锁。 先介绍与加密解密有关的几个基本概念。 加密(Encryption):加密是将明文转换为密文的过程,使得未经授权的人无法读懂。 解密&a…

Sharding-JDBC之ComplexKeysShardingAlgorithm(复合分片算法)

目录 一、简介二、maven依赖三、数据库3.1、创建数据库3.2、创建表 四、配置(二选一)4.1、properties配置4.2、yml配置 五、复合分片算法六、实现6.1、实体层6.2、持久层6.3、服务层6.4、测试类6.4.2、根据时间范围查询订单 一、简介 实际工作中&#xf…

Flutter组件 StatefulWidget、StatelessWidget 可继承写法

前言 学过Java的同学,应该都知道面向对象语言的三大特征,封装、继承、多态; Dart也是面向对象的语言,但是在Flutter中的很多组件都被下划线 _ 标记为私有,导致无法继承,本文将介绍一种非私有的创建组件写…

Oracle 面试题 | 08.精选Oracle高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

正则表达式可视化工具regex-vis

什么是正则表达式 ? 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。【百度百科】 正则表达式用简短…

idea中找到所有的TODO

idea中找到所有的TODO (1)快捷键 Alt6 (2)View -> Tool Windows -> TODO