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