为什么要阅读源码?这是一个有趣的问题,类似的问题还有,为什么要看书?为什么要爬山?

这也是一个哲学问题,我想每个人都有不同的答案,下面我是对阅读源码好处的一些思考。
(PS:也欢迎你在评论区留言补充)

阅读源码的好处

1.知其然知其所以然

这是一句 IT 人都很熟悉的话,在开源软件越来越多,并且升级越来越快的今天,如果说还有什么是重要的,那一定是知道它(开源软件)的核心原理和执行流程,这样就能为我们快速定位并修复问题提供宝贵的时间。

2.让自己变得更加优秀

学习源码可以让我们站在巨人的肩膀上,你可以学习源码中的优秀编码技巧和巧妙的设计思路,以及设计模式的落地应用,还有一些经典的编码规范和命名规则等。以此来约束和改进自己的编程代码,才能写成更好的代码。

3.找到更好的工作

在日益竞争激烈的面试中,尤其是在大厂的面试中,对于源码的考察非常看重,只有了解和熟悉这些源码,才能获得自己想要的 offer。

那既然阅读源码有这么多的好处,我们该如何开始呢?

如何阅读源码?

阅读源码的实现思路是这样的,首先我们需要下载 Spring 源码,然后把 Spring 的源码导入到 IDE 中,然后再编译 Spring 源码,再以添加 Module 的方式添加测试代码,再把 Spring 源码部分引入到 Module 中,此时我们就可以使用调试功能进入 Spring 框架的内部,查看方法的执行流程和源码的具体实现。

Spring 源码阅读流程,如下图所示:

搭建Spring源码阅读环境

本文实现环境:Window 10 / JDK 8 / Spring 5.2.2 / IDEA 2019

注意:Spring 5.1 之后需要 JDK 8 以上的环境。

1.安装Gradle

在正式开始之前我们需要先安装 Gradle,因为 Spring 是基于 Gradle 构建的

Gradle 是一个开源的基于 JVM 构建工具,和 Maven 工具类似。项目的构建经历了三个时代:Apache Ant(2000 年左右)、Maven(2004年)和 Gradle(2012 年左右),Gradle 相比于 Maven 配置更加简单、性能更高、用户体验更好(IDE 支持代码提示)。

例如,使用 maven 时,配置文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Maven Quick Start Archetype</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency></dependencies>
</project>

换成 Gradle,配置如下:

apply plugin:'java'
group='com.mycompany.app'
archivesBaseName='my-app'
version='1.0-SNAPSHOT'repositories{mavenCentral()
}dependencies{testCompile 'junit:4.13'
}

Hibernate、Spring 等优秀的开源项目都将自己的项目从 Maven 迁移到了 Gradle,Google 官方 Android 开发的 IDE Android Studio 也默认使用了 Gradle 进行构建。但不可否认的是,Maven 在如今仍然是 Java 项目构建的主流方式。

Gradle 和 Maven 的性能测试,如下图所示:

IDEA 对 Gradle 的支持如下图所示:

更多关于 Gradle vs Maven 的文章,可以访问 Gradle 官方提供文章:https://gradle.org/maven-vs-gradle/

首先,我们需要下载 Gradle 安装包,下载地址为:https://gradle.org/releases/

选择 binary-only 安装包,下载即可。

注意:需要安装 Gradle 5.X 的版本,Spring 最新版不支持 Gradle 6+ 版本。如果安装 6+ 版本会报错,信息如下:

The build scan plugin is not compatible with Gradle 6.0 and later.
Please use the Gradle Enterprise plugin instead.
Open File

下载完成之后,我们需要解压 Gradle 到指定的目录,例如“C:\Gradle\gradle”。

解压完成之后,我们需要配置两个系统变量。

右键计算机 -> 属性 -> 高级系统设置 -> 环境变量,在系统变量区域,先点击“新建”输入变量名为:GRADLE_HOME,变量值为:C:\gradle\gradle-5.6.4(根据自己的路径填写);再找到 Path 环境变量,新增配置“%GRADLE_HOME%\bin”。

到这里 Gradle 的安装就已经完成了,接下来我们使用命令行执行工具,来测试一下 Gradle 安装是否成功。

打开一个新的 cmd 命令窗口,输入命令 gradle -v,如果出现版本消息,则说明配置成功,如下所示:

C:\Users\stone>gradle -v------------------------------------------------------------
Gradle 5.6.4
------------------------------------------------------------Build time:   2019-11-01 20:42:00 UTC
Revision:     dd870424f9bd8e195d614dc14bb140f43c22da98Kotlin:       1.3.41
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.14 compiled on March 12 2019
JVM:          1.8.0_211 (Oracle Corporation 25.211-b12)
OS:           Windows 10 10.0 amd64

出现如上版本信息,则说明 Gradle 已经正常安装完成。

Gradle 加速

和 Maven 的配置相同,我们可以给 Gradle 配置一个阿里的数据源,加速项目的构建(加上下载 Jar 包),找到配置文件 init.gradle,我的默认目录在 C:\Users\用户名.gradle,如果没有找到则新建一个 init.gradle 文件,之后添加如下配置:

allprojects {repositories {maven {url "http://maven.aliyun.com/nexus/content/groups/public"}}
}

2.下载最新版的Spring源码

Spring 源码地址:https://github.com/spring-projects/spring-framework

小贴士:最好 Fork 一个项目,因为这样你就可以修改源码并添加注释信息到你的仓库了,这样就可以把自己学习 Spring 源码的过程记录并管理起来。

源码下载加速

因为 Spring 的源码文件比较多,如果使用 Spring 原地址下载的话时间会非常长,甚至会失败尝试很多次才能完成,此时我们可以使用国内码云(gitee)上的地址,下载速度会快很多,码云的地址为https://gitee.com/mirrors/Spring-Framework

如下图所示,使用官方提供的 Spring 源码地址,每天同步一次。

3.导入和编译Spring

Spring 源码下载完成之后,我们就可以使用 IDEA 导入源码项目了,为了加快源码编译的速度,在导入之后我们可以编辑 Spring 源码根目录下的 settings.gradle 文件,添加阿里的源配置信息:

maven { url “http://maven.aliyun.com/nexus/content/groups/public/”}

配置如图所示:

接下来我们就可以导入 Spring 源码了,点击 Import Project,选择 Spring 源码的路径,选择 Gradle 方法导入,如下图所示:

点击 Next,选择本地的 Gradle 路径,如下图所示:

然后点击 Finish 就会进入项目的自动构建阶段了。

Spring 构建完成(耗时比较长),如下图所示:

到现在为止,Spring 源码的搭建就已经完成了。

调试Spring源码

首先我们在 Spring 源码项目中新增一个测试项目,点击 New -> Module… 创建一个 Gradle 的 Java 项目,如下图所示:

创建完成之后,我们在 build.gradle 中添加对 Spring 源码的依赖:

api(project(":spring-context"))

如下图所示:

接着,我们需要在项目中创建一个 bean 和配置文件(application.xml)及启动文件(MyApplication.java)。

bean 实现代码如下:

public class Person {private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

启动类 MyApplication 代码如下:

import org.springframework.beans.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyApplication {public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("classpath*:application.xml");Person person = context.getBean("person", Person.class);System.out.println(person.getName());}
}

配置文件 application.xml(在 resources 中)配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="person" class="org.springframework.beans.Person"><property name="id" value="1"/><property name="name" value="Java"/></bean>
</beans>

接下来我们就可以启动并调试 Spring 的源码了。

总结

Spring 源码的阅读并没有我们想的那么难,安装 Spring 源码的调试坏境只是帮你理清楚 Spring 的执行流程。我们只需要下载 Spring 的源码,安装 Gradle 的环境,再导入到编译器中编译 Spring 源码包,最后在 Spring 源码项目中新建一个 Java 项目添加对 Spring 模块的引用,就可以调试并执行 Spring 源码了,这样我们就可以进入 Spring 的内部,进行相关的源码阅读了。

更多精彩内容,请关注微信公众号「Java中文社群」

想读Spring源码?先从这篇「 极简教程」开始吧...相关推荐

  1. 想读Spring源码?先从这篇「 极简教程」开始

    来自:Java中文社群 为什么要阅读源码?这是一个有趣的问题,类似的问题还有,为什么要看书?为什么要爬山? 这也是一个哲学问题,我想每个人都有不同的答案,下面我是对阅读源码好处的一些思考.(PS:也欢 ...

  2. 想读项目源码?可为什么总是读不下去?

    似曾相识的场景 你听说Spring已经有一段时间了,它已经是Java企业级开发事实上的标准.你觉得自己应该读一读Spring的源码,深入理解一下Spring的实现,这能使自己更好的使用Spring,同 ...

  3. 读spring源码(一)-ClassPathXmlApplicationContext-初始化

    工作来几乎所有的项目都用到了spring,却一直没有系统的读下源码,从头开始系统的读下吧,分章也不那么明确,读到哪里记到哪里,仅仅作为个笔记吧. 先看ClassPathXmlApplicationCo ...

  4. Spring源码(十)-IOC终结篇

    前言 不知不觉,Spring源码已经写了9篇,这一章就画上一个句号了,IOC这块就暂时结束.这一篇就之前的内容做些总结,主要写一些大致的流程. [详细参考]bean的初始化 1.bean的生命周期 1 ...

  5. spring源码bean生命周期篇 一 如何实例化对象

    当前源码springboot版本为2.1.6.RELEASE ,spring版本为5.1.8.RELEASE 代码粘贴的也只有相关重要部分,如果是需要全部的代码请看源码 章节内容 (1) spring ...

  6. Spring源码分析番外篇二:事务原理番外篇

    文章目录 1.获取事务 1.1 创建事务实例--doGetTransaction 1.2 处理存在的事务--handleExistingTransaction 1.3 开启新事务 1.3.1 事务开启 ...

  7. 工作以来一直在CRUD,Spring源码该怎么阅读?这份价值百万的源码解析让你如有神助!

    初学SpringBoot框架时,第一次启动服务,直呼什么鬼?只需要简单的几步配置,几个核心的注解,就可以快速实现工程的搭建和运行: 虽然从Spring框架迁移到SpringBoot框架,在初期会有很多 ...

  8. 一文搞懂Spring,堪称Spring源码终结者

    Spring的影响力想必无需与大家多说,如果你用spring,那么读读源码有助于对你最重要的工具的理解,好的框架源码也可以帮助我们理解什么是好代码. 刚参加工作那会,没想过去读源码,更没想过去改框架的 ...

  9. Spring源码解读(一)——容器是如何初始化的

    为什么要读源码 Spring是一群优秀的框架组成的社区.现在已经非常丰富了.当我们享受着Spring带来的便利同时,有时也想一探究竟. 人人都说Spring好,难免有人趋之若鹜,如果让你说出个究竟,你 ...

最新文章

  1. 国外版莆田系医院要凉了:谷歌禁止未验证、没有科学根据的医疗广告
  2. python爬虫教程 百度云-如何使用python编程【python爬虫教程 百度云】
  3. python3命令行运行程序怎么关闭_python中怎样退出程序运行?
  4. 思科网络基础配置命令大全(二)
  5. severity distribution: tail of distributions
  6. java web开发技巧_java web开发技巧
  7. ReactNative开发笔记(持续更新...)
  8. Spring 运用 pointcut 和 advisor 对特定的方法进行切面编程
  9. JQuery中的特殊选择器--this
  10. 餐厅点餐系统:测试与部署
  11. python部分 + 数据库 + 网络编程
  12. 计算机管理员四级,计算机四级基本知识点
  13. java获取当前日期时间_Java日期时间API系列10-----Jdk8中的DateTimeFormatter
  14. linux虚拟网卡上网,Linux添加虚拟网卡的多种方法
  15. 一文读懂Hive(架构原理,DDL,常用函数,优化技巧)
  16. linux终端什么字体舒服,推荐一款 Linux 上比较漂亮的字体
  17. 前端解析token中的数据_[前端基础]数据类型判定原理解析
  18. win+快捷键(常用)
  19. 柱状图柱子上面显示数字
  20. python摄氏温度换算_python华氏温度转为摄氏温度

热门文章

  1. bootstrap-select动态生成数据,设置默认选项(默认值)
  2. 调用打开另外一个APK
  3. Exchange server 2013(十四)WSUS部署及组策略设置(2)
  4. [计算机网络]httpserver--如何解析HTTP请求报文
  5. Visio显示不完整
  6. atitit.atiOrmStoreService 框架的原理与设计 part1  概述与新特性
  7. ie6 javascript js 缺少标识符总结(转载)
  8. 漫谈软件研发特种部队之中的一个
  9. jsonrpc aria2_抛弃迅雷,Aria2 新手入门
  10. php 接口安全解决方案,php接口数据安全解决方案(一)