Spring 源码解析 | 5.3.x 源码编译

 2023-02-11
原文作者:心城以北 原文地址:https://juejin.cn/post/7011900106408624142

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

源码下载

首先去 GitHub 上面下载源码。下载地址: github.com/spring-proj… 注意如果觉得下载比较慢的话,可以先同步到自己的 gitee 仓库在下载,下面是我 gitee 仓库的地址 gitee.com/zhengsh/spr…

配置信息

环境信息:

  • idea 2021.2
  • jdk 11
  • gradle-6.9.1

注意:尽量和我的环境信息保持一致,不然可能导致编译失败,或者导入项目的时候出一些奇奇怪怪的问题

导入项目

导入项目过后就是漫长的等待,等待编译,最终加载完成后,如下图所示(其实源码目录根目录下有一个 import-into-idea.md 里面也有导入的说明,大家也可以参照这个执行):

202301012122441811.png

修改镜像仓库地址

spring源码下载依赖时,默认使用的是spring的仓库,由于网络限制,建议在build.gradle中配置国内的阿里提供的镜像仓库下载

    repositories {
      //新增以下2个阿里云镜像
      maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
      maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
      mavenCentral()
      maven { url "https://repo.spring.io/libs-spring-framework-build" }
      maven { url "https://repo.spring.io/milestone" } // Reactor
      //新增spring插件库
      maven { url "https://repo.spring.io/plugins-release" }
    }

预编译 spring-oxm

执行命令 ./gradlew :spring-oxm:compileTestJava

导入项目

idea 选择 file -> open -> 选择源码目录 -> 点击 open

202301012122449822.png 再次弹出会话框选择 open as project.

202301012122455013.png 后续就是漫长的等待了, 这个具体的时间要看自己的电脑,以及对于依赖下载的速度了。

测试案例

创建模块

可以创建一个测试模块, summer-test

202301012122459594.png

添加依赖

然后在 build.gradle 添加依赖

    dependencies {
        compile(project(":spring-core"))
        compile(project(":spring-aop"))
        compile(project(":spring-beans"))
        compile(project(":spring-context"))
    }

测试代码

最后添加测试代码

    public class BeanTest {
    
    	public static void main(String[] args) {
    		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
    		UserService serviceService = applicationContext.getBean(UserService.class);
    		System.out.println(serviceService);
    	}
    }
    
    // AppConfig.java
    @Configurable
    public class AppConfig {
    
    	@Bean
    	private UserService user() {
    		return new UserService();
    	}
    }
    
    // UserService.java
    public class UserService {
    
    }

参考信息