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

news2024/11/17 14:35:02

目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营29期|day38 任务以及具体安排

第九章 动态规划part01 509. 斐波那契数 //非压缩状态的版本 class Solution {public int fib(int n) {if (n < 1) return n; int[] dp new int[n 1];dp[0] 0;dp[1] 1;for (int index 2; index < n; index){dp[index] dp[index - 1] dp[index - 2];}r…

【AI数字人-论文】Geneface论文

文章目录 前言pipelineaudio-to-motionMotion domain adaptation可视化 Motion-to-imageHead-NeRFTorso-NeRF 结果对比 前言 语音驱动的说话人视频合成旨在根据一段输入的语音&#xff0c;合成对应的目标人脸说话视频。高质量的说话人视频需要满足两个目标&#xff1a; &#…

【无标题】Vue项目中你是如何解决跨域的呢?

文章目录 一、跨域是什么二、如何解决CORSProxy 一、跨域是什么 跨域本质是浏览器基于同源策略的一种安全手段 同源策略&#xff08;Sameoriginpolicy&#xff09;&#xff0c;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能 所谓同源&#xff08;即指在同一个域…

Cmake语法学习3:语法

1.双引号 1.1 命令参数 1&#xff09;介绍 命令中多个参数之间使用空格进行分隔&#xff0c;而 cmake 会将双引号引起来的内容作为一个整体&#xff0c;当它当成一个参数&#xff0c;假如你的参数中有空格&#xff08;空格是参数的一部分&#xff09;&#xff0c;那么就可以使…

智慧商城(continue)

文章目录 1.静态页面结构准备和动态渲染2.搜索 - 历史记录管理1. 写好基础静态页面,可以先往里面加一点假数据2. 上面基本的渲染直接利用history渲染就可以了3. 搜索历史基本渲染结束了,开始点击搜索添加历史4. vant内用v-model" ",可以快速拿到搜索框的值5. 往历史记…

Vue3.0(一):Vue的引入-options api-模板语法

Vue的引入方式 CDN方式进行引入 将以下 script标签引入即可 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script><!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><met…

oracle19C 密码包含特殊字符@ 导致ORA-12154

oracle 19C 密码包含特殊字符 出现登录失败&#xff0c;针对此问题一次说个明白 ORA-12154: TNS:could not resolve the connect identifier specified Oracle 19c之前密码是可以包含特殊字符&#xff0c;但是如果包含特殊字符需要双引号 比如oracle11g 正常 如果密码包含特殊…

创新大赛专访丨金智维荣膺2023年度数字化创新服务卓越品牌:专注提供企业级RPA平台,重塑企业生产力,让员工更有价值

日前&#xff0c;2023第三届全国人力资源创新大赛颁奖典礼暨成果展圆满举行。自2023年10月份启动以来&#xff0c;大赛共吸引了457个案例报名参赛&#xff0c;经组委会专家团队评审严格审核&#xff0c;企业赛道共有103个案例获奖、72家企业、13位个人、7个产业园斩获荣誉。 珠…

帮管客CRM SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

简单实践 java spring boot 自动配置模拟

1.概要 1.1 需求&#xff0c;自己写一个redis-spring-boot-starter模拟自动配置 自动配置就是在引入*-starter坐标后&#xff0c;可以已经spring框架的规则实现一些Bean的自动注入&#xff0c;并设置一些参数的默认值&#xff0c;且也可以在引入的工程中修改这些配置的值。这…

C#代码添加脚本头

目录 前言 代码展示 前言 创建脚本的时候添加脚本的介绍 代码展示 using System.IO;/// <summary> /// 创建脚本自动添加头注 /// </summary> public class CommentFirst : UnityEditor.AssetModificationProcessor {/// <summary>/// 在资源创建生成.me…

springboot整合RabbitMQ,RabbitMQ实现高级特性消息不丢失

1.生产者可靠性消息投递 简单操作参考---------打开主页上篇博客 https://blog.csdn.net/weixin_45810161/article/details/135906602?spm1001.2014.3001.5501 在使用RabbitMQ的时候,怎么保证保证消息不丢失,RabbitMQ提供了两种不同的方式来控制消息的可靠性投递 1.confirm…

js中的数据类型(存储上的差别)

文章目录 前言一、基本类型NumberUndefinedStringNullBooleanSymbol 二、引用类型ObjectArrayFunction其他引用类型 三、存储区别基本类型引用类型 小结 前言 在JavaScript中&#xff0c;我们可以分成两种类型&#xff1a; 基本类型复杂类型 两种类型的区别是&#xff1a;存…

老版本labelme如何不保存imagedata

我的版本是3.16&#xff0c;默认英文且不带取消保存imagedata的选项。 最简单粗暴的方法就是在json文件保存时把传递过来的imagedata数据设定为None&#xff0c;方法如下&#xff1a; 找到labelme的源文件&#xff0c;例如&#xff1a;D:\conda\envs\deeplab\Lib\site-packages…

jsp自助点餐管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 自助点餐管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

PCB笔记(二十三):allegro 标注长宽(一般用于测量板宽)时如何显示双单位

步骤&#xff1a;首先选择标注工具&#xff0c;然后右键→Parameters&#xff0c;在弹出来的窗口中√上如下图二所示选项 最终要达到显示单位的效果的话&#xff0c;需要在Text项键入%v%u。 今天就记录到这里啦O

Jmeter直连mysql数据库教程

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

正则表达式与文本处理工具

目录 引言 一、正则表达式基础 &#xff08;一&#xff09;字符匹配 1.基本字符 2.特殊字符 3.量词 4.边界匹配 &#xff08;二&#xff09;进阶用法 1.组与引用 2.选择 二、命令之-----grep &#xff08;一&#xff09;基础用法 &#xff08;二&#xff09;高级用…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

Spring Bean 生命周期常见错误

虽然说 Spring 容器上手简单&#xff0c;可以仅仅通过学习一些有限的注解&#xff0c;即可达到快速使用的目的。但在工程实践中&#xff0c;我们依然会从中发现一些常见的错误。尤其当你对 Spring 的生命周期还没有深入了解时&#xff0c;类初始化及销毁过程中潜在的约定就不会…