Spring5.0.x源码环境搭建

源码获取

  1. 输入GitHub官网并搜索Spring,如下图所示:
    Spring5.0.x源码环境搭建_第1张图片

  2. 找到对应的spring-framework的工程,点击链接进入,如下图所示:

Spring5.0.x源码环境搭建_第2张图片

  1. 切换为Spring 5.0.x版本源码,并获取git分支链接,分支也切换到5.0.x版本,如下图所示:
    Spring5.0.x源码环境搭建_第3张图片

源码下载以及IDEA导入

  1. 下载源码
    Spring5.0.x源码环境搭建_第4张图片

  2. 导入idea并修改配置

Spring5.0.x源码环境搭建_第5张图片
Spring5.0.x源码环境搭建_第6张图片

对应的包拉取地址换成阿里云,否则会报错:jar包无法下载等错误
Spring5.0.x源码环境搭建_第7张图片

buildscript {
	repositories {
		gradlePluginPortal()
		maven { url "https://maven.aliyun.com/repository/spring-plugin" }
	}
	dependencies {
		classpath("io.spring.gradle:propdeps-plugin:0.0.9.RELEASE")
		classpath("io.spring.gradle:docbook-reference-plugin:0.3.1")
		classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16")
		classpath("org.asciidoctor:asciidoctorj-epub3:1.5.0-alpha.7")
	}
}

Spring5.0.x源码环境搭建_第8张图片

repositories {
		maven { url "https://maven.aliyun.com/repository/public" }
		maven { url "https://maven.aliyun.com/repository/google" }
		maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
		mavenCentral()
		maven { url "https://repo.spring.io/libs-spring-framework-build" }
		maven { url "https://maven.aliyun.com/repository/spring" }
}

编译错误解决

所有依赖包下载完毕后,点击build,出现cglib和objenesis编译报错,如下图所示

为了避免第三方class的冲突,Spring把最新的cglib和objenesis给重新打包了(repack)了,它并没有在源码提供这部分代码,而是直接将其放在jar包当中,这也就导致了我们拉取代码后出现编译错误。那么为了通过编译,我们要把缺失的jar补回来

compile fileTree(dir:'libs',include: '*.jar')

遇到spring-oxm模块中测试类找不到怎么办?执行如下图所示对应的两个命令:
Spring5.0.x源码环境搭建_第9张图片

遇到spring-orm报错,找不到符合怎么办?如下所示,因为都是测试类,直接注释代码
Spring5.0.x源码环境搭建_第10张图片

遇到aspect相关类报错怎么办?报错信息如下图所示:
Spring5.0.x源码环境搭建_第11张图片

我们发现类的声明使用了aspect而不是class

Aspect问题原因

AOP(Aspect Orient Programming,面向切面编程)作为面向对象编程的一种补充,当前已经成为一种比较成熟的编程思想。

而AOP在Spring中也占据者举足轻重的作用,可以说没有AOP就没有Spring现在的流行,当然AOP的实现有些时候也依赖AspectJ

AspectJ实现AOP

如下示例:

public class HelloWorld{
    public void sayHello(){
        System.out.println("Hello AspectJ");
    }
    
    public static void main(String args[]){
        HelloWorld h = new HelloWorld();
        h.sayHello();
    }
}

如上代码毫无疑问会输出“Hello AspectJ”字符串。假设现在客户需要在执行sayHello方法前启动事务,当该方法结束时关闭事务,则在传统编程模式下,我们必须手动修改sayHello方法,如果改用AspectJ,则可以无需修改上面的sayHello方法。下面我们定义一个特殊的“类”

public aspect TxAspect{
    void around():call(void sayHello()){
        System.out.println("Transaction Begin");
        proceed();
        System.out.println("Transaction end");
    }
}

如上所示,TxAspect根本不是一个java类,所以aspect也不是java所支持的关键字,它只是AspectJ才认识的关键字

因为java无法识别TxAspect.java文件中的内容,所以我们需要使用ajc.ext来执行编译:

ajc HelloWorld.java TxAspect.java

可以理解为ajc命令是增强版的javac命令。运行HelloWorld类:

Transaction Begin
Hello AspectJ
Transaction end

问题解决

下载AspectJ

下载AspectJ,选择版本,如下图所示:

Spring5.0.x源码环境搭建_第12张图片

安装AspectJ

直接点击jar包安装,注意最后一步需要选择JDK的安装地址

Spring5.0.x源码环境搭建_第13张图片

为spring-aspect工程添加Facets属性

Spring5.0.x源码环境搭建_第14张图片

Spring5.0.x源码环境搭建_第15张图片

更改编译器

编译器要改为Ajc,同时要设置Ajc的安装目录,要选择到aspectjtools.jar这个层面,同时务必要选择Delegate to Javac选项,它的作用是只编译AspectJ的Facets项目,其他使用JDK代理,如果不勾选,会全部使用Ajc编译,会导致编译错误

Spring5.0.x源码环境搭建_第16张图片

编译成功

Spring5.0.x源码环境搭建_第17张图片

验证源码环境

新建gradle工程
Spring5.0.x源码环境搭建_第18张图片

添加依赖
Spring5.0.x源码环境搭建_第19张图片

配置bean
Spring5.0.x源码环境搭建_第20张图片

新建测试类并运行
Spring5.0.x源码环境搭建_第21张图片
Spring5.0.x源码环境搭建_第22张图片

你可能感兴趣的:(Spring源码深度解析,git,spring,github)