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

Posted Java中文社群

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想读Spring源码?先从这篇「 极简教程」开始相关的知识,希望对你有一定的参考价值。

这是我的第 47 篇原创文章。

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

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

阅读源码的好处

1.知其然知其所以然

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

2.让自己变得更加优秀

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

3.找到更好的工作

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

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

如何阅读源码?

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

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 的性能测试,如下图所示:想读Spring源码?先从这篇「 极简教程」开始IDEA 对 Gradle 的支持如下图所示:想读Spring源码?先从这篇「 极简教程」开始

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

选择 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:     dd870424f9bd8e195d614dc14bb140f43c22da98

Kotlin:       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源码

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

源码下载加速

3.导入和编译Spring

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

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

配置如图所示:想读Spring源码?先从这篇「 极简教程」开始

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

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

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

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

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

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

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

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

调试Spring源码

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

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

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

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

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

如下图所示:想读Spring源码?先从这篇「 极简教程」开始

接着,我们需要在项目中创建一个 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 的内部,进行相关的源码阅读了。




往期推荐





关注下方二维码,订阅更多精彩内容

以上是关于想读Spring源码?先从这篇「 极简教程」开始的主要内容,如果未能解决你的问题,请参考以下文章

想读Spring源码?先从这篇清华版极简教程开始吧...

spring源码阅读笔记之HelloWorld和spring第一步ClassPathXMLApplicationContext

spring源码之IOC的非核心部分

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

Linux系列教程——Linux软件包管理之RPM命令

Spring系列(一)Spring MVC bean 解析、注册、实例化流程源码剖析