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

目录

[一、Spring Framework 源码获取问题](#一、Spring Framework 源码获取问题)

[1.1 Spring Framework 官网](#1.1 Spring Framework 官网)

[1.2 Spring Framework 源码地址](#1.2 Spring Framework 源码地址)

[1.3 关于访问不了GitHub 官网的解决方案](#1.3 关于访问不了GitHub 官网的解决方案)

[1.3.1 修改本地hosts文件](#1.3.1 修改本地hosts文件)

[1.3.2 GitHub520](#1.3.2 GitHub520)

[1.3.3 Gitee 导入](#1.3.3 Gitee 导入)

[二、Spring Framework 源码编译](#二、Spring Framework 源码编译)

[2.1 环境说明](#2.1 环境说明)

[2.1.1 JDK版本](#2.1.1 JDK版本)

[2.1.2 Gradle 版本](#2.1.2 Gradle 版本)

[2.1.2.1 Gradle 安装](#2.1.2.1 Gradle 安装)

[2.1.2.1.1 下载](#2.1.2.1.1 下载)

[2.1.2.1.2 环境变量配置](#2.1.2.1.2 环境变量配置)

[2.1.2.1.3 版本查看](#2.1.2.1.3 版本查看)

[2.1.2.1.4 配置镜像仓库](#2.1.2.1.4 配置镜像仓库)

[2.2 源码编译](#2.2 源码编译)

[2.2.1 配置build.gradle](#2.2.1 配置build.gradle)

[2.2.2 配置 settings.gradle](#2.2.2 配置 settings.gradle)

[2.2.3 配置gradle下载地址](#2.2.3 配置gradle下载地址)

[2.2.4 预编译spring-oxm](#2.2.4 预编译spring-oxm)

[2.2.5 导入工程](#2.2.5 导入工程)

[2.2.6 修改spring-aspects工程](#2.2.6 修改spring-aspects工程)

[2.3 测试](#2.3 测试)

[2.3.1 新增测试模块](#2.3.1 新增测试模块)

[2.3.2 添加依赖](#2.3.2 添加依赖)

[2.3.3 测试代码](#2.3.3 测试代码)

[2.3.4 测试结果](#2.3.4 测试结果)

[三、Spring Framework 源码结构说明](#三、Spring Framework 源码结构说明)

[3.1 整体架构](#3.1 整体架构)

[3.1.1 整体架构图](#3.1.1 整体架构图)

[3.2 模块介绍](#3.2 模块介绍)

[3.2.1 spring-aop](#3.2.1 spring-aop)

[3.2.2 spring-aspects](#3.2.2 spring-aspects)

[3.2.3 spring-beans](#3.2.3 spring-beans)

[3.2.4 spring-context](#3.2.4 spring-context)

[3.2.5 spring-context-indexer](#3.2.5 spring-context-indexer)

[3.2.6 spring-context-support](#3.2.6 spring-context-support)

[3.2.7 spring-core](#3.2.7 spring-core)

[3.2.8 spring-expression](#3.2.8 spring-expression)

[3.2.9 spring-framework-bom](#3.2.9 spring-framework-bom)

[3.2.10 spring-instrument](#3.2.10 spring-instrument)

[3.2.11 spring-jcl](#3.2.11 spring-jcl)

[3.2.12 spring-jdbc](#3.2.12 spring-jdbc)

[3.2.13 spring-jms](#3.2.13 spring-jms)

[3.2.14 spring-messaging](#3.2.14 spring-messaging)

[3.2.15 spring-orm](#3.2.15 spring-orm)

[3.2.16 spring-oxm](#3.2.16 spring-oxm)

[3.2.17 spring-test](#3.2.17 spring-test)

[3.2.18 spring-tx](#3.2.18 spring-tx)

[3.2.19 spring-web](#3.2.19 spring-web)

[3.2.20 spring-webflux](#3.2.20 spring-webflux)

[3.2.21 spring-webmvc](#3.2.21 spring-webmvc)

[3.2.22 spring-websocket](#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 系统:
bash 复制代码
C:\Windows\System32\drivers\etc\hosts
  • Linux 系统:
bash 复制代码
/etc/hosts
  • Mac(苹果电脑)系统:
bash 复制代码
/etc/hosts

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

bash 复制代码
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

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

2.2.2 配置 settings.gradle

bash 复制代码
# 新增,阿里依赖源
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说明文档

bash 复制代码
./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 运行时上下文依赖内容,具体如下:

bash 复制代码
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 测试代码

java 复制代码
package com.ningzhaosheng.spring.sample.service;

/**
 * @author ningzhaosheng
 * @date 2024/1/29 21:33:18
 * @description
 */
public interface IPersonService {
	void speak();
}
java 复制代码
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("我会说中文");
	}
}
java 复制代码
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");
	}
}
java 复制代码
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源码的文章,欢迎关注本博主。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

相关推荐
救救孩子把6 分钟前
深入理解 Java 对象的内存布局
java
落落落sss8 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
万物皆字节14 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
夜雨翦春韭21 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
我行我素,向往自由27 分钟前
速成java记录(上)
java·速成
一直学习永不止步33 分钟前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
邵泽明34 分钟前
面试知识储备-多线程
java·面试·职场和发展
Yvemil71 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的1 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
煸橙干儿~~1 小时前
分析JS Crash(进程崩溃)
java·前端·javascript