阅读Spring源码,我们可以通过以下两种方式:
- 直接在Idea/Eclipse上创建自己的java maven/gradle项目,导入Spring特定版本依赖Jar和源码,直接运行测试代码,逐步调试阅读
- 从github直接获取Spring源码项目,基于Spring源码项目,创建自己的子模块,进行本地项目的Spring源码调试。
对于方式一的好处是可以方便快捷地开始阅读Spring源码,但由于源码来源于Jar包,无法在阅读过程中在源码里添加注释。
对于方式二,虽然开始操作比较麻烦,但后续我们可以基于版本管理随意地对本地项目源码进行修改、添加注释等相关操作。
下面基于方式二,搭建Spring源码阅读环境。
操作步骤
获取Spring源码
- 安装git组件,可以从官网下载,根据官网进行安装。
- 从github拉去Spring源码,切换到要阅读的版本分支,这里以阅读3.2.18.REALEASE为例。
git clone https://github.com/spring-projects/spring-framework.git
cd spring-framework
git checkout -b v3.2.18.RELEASE
至此代码检出完成
配置Idea测试环境
Spring源码基于Gradle管理,在此之前需要安装 Gradle,这个不多说,下面基于Idea进行示例操作:
首先导入我们的项目到Idea,选择Import Project,然后找到spring-framework文件夹,选中打开项目,导入完后,添加Gradle相关特性,等待Spring项目编译完成
项目右键->New->Module,基于Gradle-Java 点击Next,如下图:
基于Spring子模块,GroupId和Version全部继承,然后输入ArtifactId,如下所示,再点击Next,确认模块名和项目路径后,最后点击finish。
最后再创建的项目模块下,修改build.gradle文件,根据自己需要添加所需Jar,注意通过compile(project(":spring-beans"))
等引入本地项目依赖,方便在调试的时候调用本地Spring项目源码,配置如下所示:
plugins {
id 'java'
}
group 'org.springframework'
version '3.2.18.RELEASE'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile "javax.servlet:javax.servlet-api:3.1.0"
compile 'com.google.guava:guava:21.0'
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
compile 'mysql:mysql-connector-java:5.1.20'
compile 'cglib:cglib:3.2.5'
compile 'org.hibernate.validator:hibernate-validator:6.0.2.Final'
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.5'
compile group: 'junit', name: 'junit', version: '4.12'
compile(project(":spring-beans"))
compile(project(":spring-core"))
optional(project(":spring-aop"))
optional(project(":spring-context"))
optional(project(":spring-oxm"))
optional(project(":spring-webmvc"))
optional(project(":spring-tx"))
}
注意:同步修改Spring各个项目模块下build.gradle中的以下两个配置:
sourceCompatibility=1.8
、targetCompatibility=1.8
,确保和项目jdk版本一直,否则会导致运行失败。
创建测试代码
- 创建log4j.properties日志文件,用于输出调试日志:
log4j.rootLogger=DEBUG,CONSOLE
log4j.addivity.org.apache=false
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} -%-4r [%t] %-5p %x - %m%n
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
- 创建spring 配置文件
config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean class="com.jeanheo.model.TestBean" id="testBean"/>
</beans>
- 创建TestBean
public class TestBean {
public void echo() {
System.out.println("Hello World");
}
}
- 创建测试入口
public class BaseTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
TestBean testBean = context.getBean("testBean", TestBean.class);
testBean.echo();
}
}
至此,Spring源码阅读环境搭建完成,通过开启Debug模式,可以通过添加断点,一步步阅读Spring源码。