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 {
	@Override
	public 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 {
	@Override
	public 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源码的文章,欢迎关注本博主。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙】大模型对话应用(四):页面发起请求实现对话能力

Demo介绍 本demo对接阿里云和百度的大模型API,实现一个简单的对话应用。 DecEco Studio版本:DevEco Studio 3.1.1 Release HarmonyOS SDK版本:API9 关键点:ArkTS、ArkUI、UIAbility、网络http请求、列表布局、层叠布局 定义接…

CSS常用动画网站(纯css echarts等 建议经常阅读 积累素材)

CSS动画代码集合 https://www.webhek.com/post/css3-animation-sniplet-collection/#/ 这个网站中将常见的css动画都进行了集合,并且有详细的代码,可以直接使用 echarts图表 https://www.isqqw.com/ echarts也是前端常用的,虽然官方文档已经给出了很多的案例,但是有时候产品还…

【数据结构与算法】之排序系列-20240202

这里写目录标题 一、389. 找不同二、414. 第三大的数三、455. 分发饼干四、506. 相对名次五、561. 数组拆分六、594. 最长和谐子序列 一、389. 找不同 简单 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添…

禁止 ios H5 中 bounces 滑动回弹效果

在开发面向 iOS 设备的 HTML5 应用时,控制页面的滚动行为至关重要,特别是禁用在 Safari 中默认的滑动回弹效果。本文旨在提供一个简洁明了的解决方案,帮助开发者在特定的 Web 应用中禁用这一效果。 1. 什么是滑动回弹效果? 在 iO…

明道云入选亿欧智库《AIGC入局与低代码产品市场的发展研究》

2023年12月27日,亿欧智库正式发布**《AIGC入局与低代码产品市场的发展研究》**。该报告剖析了低代码/零代码市场的现状和发展趋势,深入探讨了大模型技术对此领域的影响和发展洞察。其中,亿欧智库将明道云作为标杆产品进行了研究和分析。 明…

navicat中的密码忘记了,解密navicat导出的密码

navicat 导出密码 打开导出的文件&#xff0c;获取加密后的密码 进入在线执行PHP代码的网站代码在线运行 - 在线工具 将网站中的代码替换&#xff0c;执行如下代码 <?phpnamespace FatSmallTools;class NavicatPassword {protected $version 0;protected $aesKey libc…

Web3行业研究逐步加强,“链上数据”缘何成为关注焦点?

据中国电子报报道&#xff0c;近日&#xff0c;由中关村区块链产业联盟指导&#xff0c;中国信息通信研究院牵头&#xff0c;欧科云链控股有限公司参与编写的《全球Web3产业全景与发展趋势研究报告&#xff08;2023年&#xff09;》正式发布。研究报告通过全面追踪国内外Web3产…

c# Get方式调用WebAPI,WebService等接口

/// <summary> /// 利用WebRequest/WebResponse进行WebService调用的类 /// </summary> public class WebServiceHelper {//<webServices>// <protocols>// <add name"HttpGet"/>// <add name"HttpPost"/>// …

【leetcode题解C++】98.验证二叉搜索树 and 701.二叉搜索树中的插入操作

98. 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例…

Jmeter直连mysql数据库教程

mysql数据库能够通过Navicat等远程连接工具连接 下载驱动并加入jmeter 1.mysql驱动下载地址&#xff1a;MySQL :: Download MySQL Connector/J (Archived Versions) 找到对应的驱动下载&#xff1a;如下图&#xff1a; 把驱动jar包加入jmeter 配置jmeter连接mysql数据库…

02 使用jdk运行第一个java程序:HelloWorld

使用jdk运行第一个java程序 1 HelloWorld小案例1.1 编写流程1.2 错误示例 首先在CMD命令行里面&#xff0c;使用javac xxxx.java&#xff0c; 进行编译&#xff0c;其中会有报错&#xff1b; 然后生成xxxx.class 文件&#xff0c;然后使用java xxxx.class 进行运行。 1 HelloWo…

Unity animator 动画实现指定时间开始播放

在我们使用Unity帧动画时&#xff0c;如用到同一个帧动画的部分动画&#xff0c;那么我们可以考虑用指定播放时间的方法实现。 如我在场景中创建一个2D帧动画&#xff0c;并创建一个2D对象使用该帧动画。 然后复制该2D对象&#xff0c;并创建一个控制脚本GameController1.cs&a…

redis 6.x集群搭建

redis6集群搭建 安装文件下载 redis-6.2.6.tar.gz 编译 tar -zxvf redis-6.2.6.tar.gz cd redis-6.2.6/ make MALLOClibc make install PREFIX/opt/soft/redis复制可执行文件 cp /opt/soft/redis/redis-cli /usr/bin/redis-cli cp /opt/soft/redis/redis-server /usr/bi…

MySQL全表扫描:性能杀手的隐患与优化策略

MySQL全表扫描&#xff1a;性能杀手的隐患与优化策略 MySQL数据库作为常用的关系型数据库管理系统之一&#xff0c;全表扫描问题一直困扰着开发者。本文将深入剖析MySQL全表扫描的原理、其对性能的严重影响&#xff0c;同时提供一系列优化策略&#xff0c;助您高效应对MySQL性能…

STM32 UART/USART与RTOS的多任务通信和同步机制设计

在STM32微控制器中&#xff0c;UART/USART与RTOS的多任务通信和同步机制设计可以通过操作系统提供的任务调度机制和各种同步原语&#xff08;例如信号量、邮箱、消息队列等&#xff09;来实现。在下面的解释中&#xff0c;我将介绍如何设计基于FreeRTOS的STM32多任务通信和同步…

【第二十二课】最短路:多源最短路floyd算法(acwing-852 spfa判断是否存在负环 / acwing-854 / c++代码)

目录 acwing-852 代码如下 一些解释 acwing-854 foyld算法思想 代码如下 一些解释 acwing-852 在spfa求最短路的算法基础上进行修改。 代码如下 #include<iostream> #include<cstring> #include<algorithm> #include<queue> using names…

Navicate 连接云服务器MySQL

Navicate 连接云服务器MySQL 1.打开Navicate,点击左上角的连接,选择MySQL 第一步:第一个页面是常规,按照图上的标注填写 第二步,点击 SSH ,进入下面的页面 第三步&#xff0c;点击测试连接

阿里云OSS对象存储

一、前言 阿里云对象存储OSS作用&#xff1a;用于存储图片、视屏、文件等数据。 参考阿里云文档地址&#xff1a;阿里云对象存储教程 二、总体思路 说明&#xff1a;客户端给服务端发送请求&#xff0c;获取policy和signature等数据&#xff08;服务端提供&#xff09;&#…

vue3学习——自定义插件,注册组件(引入vue文件报红线)

在src/components文件夹目录下创建一个index.ts文件 import { App, Component } from Vue import SvgIcon from /components/SvgIcon/index.vue import Pagination from /components/Pagination/index.vue const globalComponents: { [name: string]: Component } { SvgIcon,…

MySQL进阶之锁(表级锁,元数据锁,意向锁)

表级锁 介绍 表级锁&#xff0c;每次操作锁住整张表。锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。应用在MyISAM、 InnoDB、BDB等存储引擎中。 对于表级锁&#xff0c;主要分为以下三类&#xff1a; 表锁 元数据锁&#xff08;meta data lock&…