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