一、Spring源码之环境搭建

原创 KimZing 2020-03-23 19:15

本篇文章主要介绍如何搭建Spring源码开发环境,并新建自己的模块。

一、环境准备

  1. Git,版本控制工具。
    • 拉取Spring源代码需要使用。(如果只下载某个版本的Spring源码,可以不使用。
  2. Gradle,项目构建工具。
    • 构建Spring项目所需要的工具,和Maven属于同一种类型的工具,Spring项目中自带了Gradle的wrapper运行脚本,可以全自动安装使用。 (暂时不用安装,即使安装也必须使用源码中指定的Gradle版本才可以,不同的Gradle版本很多功能是不兼容的。可以参考我的文章Gradle学习教程进行安装
  3. Idea/ Eclipse,集成开发工具
    • 方便代码编写、源码调试、类之间跳转、类图查看

二、获取源代码

2.1 fork官方代码到个人仓库

为了方便之后将自己编写的代码或记录进行同步备份

打开Spring代码仓库页面,点击右上角fork,稍等片刻即可完成。

2.2 下载Spring源码

Spring源码已经下载到了我们的个人仓库,打开个人项目页面,例如我的地址为https://github.com/KimZing/spring-framework,点击右侧的clone or download复制仓库地址https://github.com/KimZing/spring-framework.git

打开终端,执行git clone 仓库地址, 源码比较大,静候。

之后使用git chekout v5.2.0.RELEASE切换到指定的版本分支。(建议使用RELEASE版本,稳定不会做更改)

三、加快你的构建

如果你的网速很好,那么可以略过这一步。如果想加快依赖包的速度,需要对gradle脚本文件进行配置,增加aliyun的maven仓库中心。修改项目根目录下的build.gradle文件

方式如下:

// 在开始的buildscript中加入如下内容
// 加快构建脚本自身使用的依赖下载。
buildscript {

    repositories {
        maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
    }

  dependencies {
        classpath 'org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16'
        classpath 'io.spring.asciidoctor:spring-asciidoctor-extensions:0.1.3.RELEASE'
    }
}

// 在configure(allprojects)中添加maven仓库。
// 加快项目使用的依赖下载
configure(allprojects) {
    dependencyManagement {

        repositories {
            maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/' }
            maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
            maven { url "https://repo.spring.io/libs-spring-framework-build" }
        }

  }
}

四、根据官方文档进行构建

第一次搭建时,整个过程耗费时间很长,耐心等候。

这里使用的Idea进行构建,打开相应分支的项目根目录下的import-into-idea.md文件,按照说明操作即可。

4.1 编译spring-oxm模块

在项目根目录执行./gradlew :spring-oxm:compileTestJava,直到出现 BUILD SUCCESS时说明第一步已经成功了。

4.2 导入Idea

这个不用细说了吧,就是File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle。导入时一般就会自动进行编译构建,一定要静静的等,耗时比较长。

4.3 排除spring-aspects模块

某些spring版本的spring-aspects模块需要使用不同的编译器,而idea里面无法进行配置,所以这个模块会报错,我们可以将其进行忽略,就不会构建了。

右键spring-aspects模块-> 选择Load/Unload modules -> 将spring-aspects加入unload列表即可

到这里整个源码的环境搭建就结束了

五、添加自己的模块并执行

5.1 新建项目

右键根项目spring-framewok->New-> Module-> 选择Gradle->Java->Next-> 添加项目命名(spring-kim)->Finish,一个属于自己的项目模块就创建完成了。这个时候发现项目目录下的settings.gradle文件多了一行include 'spring-kim', 这是自动添加的,是不是很智能,省去了麻烦。但是这里有一个注意的地方,需要将include 'spring-kim'移动到rootProject.children.each的上方,否则spring的构建脚本是无法正确导入我们自定义的这个模块的。(这点可以说明gradle是按照顺序来执行脚本的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pluginManagement {
repositories {
gradlePluginPortal()
maven { url 'https://repo.spring.io/plugins-release' }
}
}

include "integration-tests"
include 'spring-kim'


rootProject.name = "spring"
rootProject.children.each {project ->
project.buildFileName = "${project.name}.gradle"
}

5.2 修改构建脚本,依赖spring-context模块进行测试

spring-kim项目下的build.gradle文件修改为spring-kim.gradle, 为什么要修改呢?看看spring其他模块下是不是都有一个项目名.gradle文件呢?spring项目的build.gradle中对每个模块的构建脚本名都做了重新配置,想知道怎么实现的,可以看下我的Gradle学习教程

改写我们的spring-kim.gradle脚本内容如下

1
2
3
4
5
6
7
8
// 对该模块的描述
description = "spring学习模块"

// 项目依赖
dependencies {
// 添加对spring-context的依赖
implementation(project(":spring-context"))
}

5.3 编写程序代码

src/main/java下新建包com.kimzing.spring

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//UserService接口
package com.kimzing.spring.service;

/**
* 用户接口.
*
* @author KimZing - kimzing@163.com
* @since 2020/3/23 18:26
*/
public interface UserService {

public String getName(String firstName, String lastName);

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// UserService实现类
package com.kimzing.spring.service.impl;

import com.kimzing.spring.service.UserService;

/**
* 用户服务实现.
*
* @author KimZing - kimzing@163.com
* @since 2020/3/23 18:28
*/
public class UserServiceImpl implements UserService {

@Override
public String getName(String firstName, String lastName) {
return String.format("I am %s%s", firstName, lastName);
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.kimzing.spring;

import com.kimzing.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* 容器启动示例.
*
* @author KimZing - kimzing@163.com
* @since 2020/3/23 18:04
*/
public class Bootstrap {

public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println(userService.getName("Kim", "Zing"));
}

}

5.4 编写配置文件

说一个小技巧: 约束文件一般写起来比较麻烦,可以在spring-context模块下的test/resources下查找xml文件,复制粘贴即可。

1
2
3
4
5
6
<?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 https://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="userService" class="com.kimzing.spring.service.impl.UserServiceImpl"></bean>
</beans>

5.5 运行Bootstrap

此时运行Bootstrap的main方法,输出如下

1
2
3
4
> Task :spring-kim:Bootstrap.main()
I am KimZing

BUILD SUCCESSFUL in 2s

到此,环境搭建和测试就完成了,如有问题,可以参考我的github项目

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×