vlambda博客
学习文章列表

01.搭建 springboot 源码分析环境

在分析springboot前,先要搭建源码分析环境,具体来说,就是把springboot源码checkout下来,然后创建自己的学习分支,之后就可以对springboot的源码为所欲为了。

1. 获取springboot源码

springboot源码托管在github[1]

不过先别急着checkout,众所周知,由于某些原因,国内的网络访问github的速度感人,直接checkout,绝大多数时候都会失败。源码拿不下来,万里长征要死在第一步了吗?当然不是,虽然直接访问github不行,但我们可以迂回进行,答应就在于gitee,我们可以在gitee上导入github项目,具体步骤如下:

1.1 在giteee上建立一个仓库,选择导入已有仓库

01.搭建 springboot 源码分析环境

1.2 在链接中,复制springboot项目的github地址

01.搭建 springboot 源码分析环境

然后点击创建,稍等一会就可以了。

自此,springboot项目就到了你自己的gitee仓库中,可以尽情地对giteespringboot代码仓库进行 checkoutpull & push了。感谢gitee提供的便利功能!

2. 创建新分支

giteecheckout springboot的源码后,一般来说是在master分支,这时我们要创建自己的分支来分析,关于为什么要创建自己的分支,原因有二:

  1. 统一版本:springboot的版本那么多,当前master是处于哪个版本呢?最新发布的版本吗?这些比较难说清,所以正确方式是,基于已发布的版本创建自己的分支。

  2. 同步后不会被覆盖:当我们将springboot的源码从github导入到gitee后,gitee上的源码就是我们在导入那一刻的源码了,之后再要同步github的源码该怎么做呢?gitee提供了同步功能,可以很方便地进行源码同步:

    01.搭建 springboot 源码分析环境

    不过这样同步有个缺点:从github上同步过来,会覆盖原本分支上修改的内容!举个例子,你将springboot的源码从github导入到gitee,然后在gitee的master分支上做了大量的笔记,之后点了同步,然后就惊喜地发现,你在master分支上的笔记都不见了,gitee的master分支与github的master完全保持一致了,惊不惊喜?不过,如果创建了自己的分支,就不会被github的分支强制同步了,这就是需要创建自己的分析的原因所在。

了解创建分支的必要性之后,就开始进行分支的创建了,这里我们基于tag来创建新分支,步骤如下:

2.1 查看tag

spring-boot-project $ git tag
v0.5.0.M1
v0.5.0.M2
v0.5.0.M3
v0.5.0.M4
v0.5.0.M5
v0.5.0.M6
...
v2.2.0.RELEASE
v2.2.1.RELEASE
v2.2.2.RELEASE
v2.2.3.RELEASE
v2.2.4.RELEASE
v2.2.5.RELEASE
...

springboot的版本挺多的,这里我们选择v2.2.2.RELEASE

  1. 为什么基于tag创建分支?tag 是相当于版本记录,里面的分支不能修改,也不能在分支上直接提交代码,也就是,tag创建后,里面的内容就不会再变化了,基于tag打分支适合我们的需求。

  2. 为什么springboot的版本要选择v2.2.2.RELEASE?目前springboot的最新的版本上v2.3.1.RELEASE,我们为何不直接分析最新版本呢?主要是因为,v2.2.2.RELEASE的spring版本是v5.2.2.RELEASE,而本人之前分析过spring v5.2.2.RELEASE 的源码(链接:spring源码分析系列文章汇总[2]),因此这里也选择了v2.2.2.RELEASE

2.2 基于tag创建分支

接下来就是基于v2.2.2.RELEASE创建分支的流程了,命令如下:

# 检出tag
git checkout v2.2.2.RELEASE
# 基于tag创建新分支
git checkout -b v2.2.2.RELEASE_learn v2.2.2.RELEASE
#  将新分支提交到远程仓库
git push -u origin v2.2.2.RELEASE_learn

执行完以上命令后,就可以在gitee上看到分支情况了:

01.搭建 springboot 源码分析环境

3. 源码编译

springboot 源码编译比较简单,如果开发工具是idea,直接运行Spring Boot Project 模块的 install命令即可:

01.搭建 springboot 源码分析环境

运行完成的结果:

01.搭建 springboot 源码分析环境

4. 创建demo模块

编译成功后,下一步就是着手写自己的测试代码了,这里本人是新建一个模块,把测试代码都写在模块里:

01.搭建 springboot 源码分析环境

模块名为spring-boot-learn,位于spring-boot-project下。这就是一个简单的maven模块创建,没啥好说的,

模块创建完成后,在src/main/java目录下创建包org.springframework.boot.learn,后续我们会把测试demo统一放在这里了。

做完这些后,还需要处理下springboot代码风格校验,不然spring-boot-learn下的代码会因为代码风格不符合规范而编译不过。自己的测试代码当然没必要严格按照springboot的代码风格,因此我们需要在spring-boot/src/chechstyle目录下的checkstyle-suppressions.xml添加如下内容:

<suppressions>
    ...
    <!-- 以下是新增内容 -->
    <!-- spring-boot-learn -->
    <suppress files="[\\/]spring-boot-learn[\\/]" checks=".*" />
    <suppress files="[\\/]src[\\/]main[\\/]java[\\/]org[\\/]springframework[\\/]boot[\\/]learn[\\/]" checks=".*" />
</suppressions>

之后,spring-boot-learn模块下的代码就可以按照自己的风格随意编写了。

5. 第一个springboot demo

以上内容就绪之后,就可以着手编写第一个demo了,方式如下:

  1. 准备controller
package org.springframework.boot.learn.demo01.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * {这里添加描述}
 *
 * @author chengyan
 * @date 2020-12-21 10:31 下午
 */

@RestController
@RequestMapping("/test")
public class TestController {

    @RequestMapping("hello")
    public String hello() {
        return "nice to meet you!";
    }

}

  1. 准备主类
package org.springframework.boot.learn.demo01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * {这里添加描述}
 *
 * @author chengyan
 * @date 2020-12-20 3:59 下午
 */

@SpringBootApplication
public class Demo01Application {

    public static void main(String[] args) {
        SpringApplication.run(Demo01Application.classargs);
    }

}

运行,结果如下:

访问 http://localhost:8080/test/hello

可以看到,demo成功运行了!


本文原文链接:https://my.oschina.net/funcy/blog/4816981 ,限于作者个人水平,文中难免有错误之处,欢迎指正!原创不易,商业转载请联系作者获得授权,非商业转载请注明出处。

【springboot源码分析】springboot源码分析系列文章汇总

参考资料

[1]

spring-boot: https://github.com/spring-projects/spring-boot

[2]

spring源码分析系列文章汇总: https://my.oschina.net/funcy/blog/4527454