工作7年,一直没时间和精力将spring从头到尾的做一次阅读。有很多人说,没读过spring等于不会java,这么多年的工作实践发现对也不全对,对是因为每天面向业务不停的CRUD说自己会java好像真的是对java的侮辱,不全对是因为spring虽然是java的一个里程碑但是在当前整个行业生态中,要想达到会java要学的东西实在是太多了,从编码到架构甚至到运维,我发觉这一行对java的要求好像特别高,面试的时候更是夸张,真的是要求你无所不能、无所不会。从2003年spring诞生到现在,spring以及其衍生的一系列周边生态都足以证明这是一款非常优秀的框架,我认为学spring要学的是他的设计和编码思路,框架终究有一天会成为过去式,但是思维却能影响我们一生。

所以没办法,5分的行业压力5分的兴趣还是准备从头到尾啃一啃这个硬骨头,本系列将从0到1根据自己的思路来做这件事情,没有华丽的词藻,特别符合一直想做但又无从做起的朋友。

万事开头难,要读源码先要有源码。

第一步,准备demo工程

首先使用idea新建一个spring工程,工程名为spring,用于debug做代码跟踪,记得勾上红色的框它将会在根目录自动创建一个spring的配置文件。

spring源码几天能读完 spring源码要看多久_spring

创建好的工程目录是这样的:

 

spring源码几天能读完 spring源码要看多久_spring源码几天能读完_02

 要学一个框架首先肯定是HelloWorld,所以依次做以下操作:

创建一个实体类HelloWorld

public class HelloWorld {

    private String name;

    public HelloWorld() {
        System.out.println("This is HelloWorld constructor.");
    }

    public void setName(String name) {
        System.out.println("This is HelloWorld SetName.");
        this.name = name;
    }

    public void sayHello() {
        System.out.println("Hello " + name);
    }
}

 在spring-config.xml进行bean申明:

<bean id="HelloWorld" class="cn.com.huangyang.learn.HelloWorld">
        <property name="Name" value="Spring"></property>
   </bean>

创建一个测试类SpringTest,新建一个main方法用于测试

public class SpringTest {

    public static void main(String[] args) {
        //1、创建一个Spring的IOC容器对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2、从IOC容器中获取Bean实例
        HelloWorld helloWorld = (HelloWorld) context.getBean("HelloWorld");
        //3、调用sayHello()方法
        helloWorld.sayHello();
    }
}

运行main方法:

spring源码几天能读完 spring源码要看多久_spring源码几天能读完_03

 至此,demo工程准备完毕。

第二步,准备源码

拉下来的源码是这样的:

spring源码几天能读完 spring源码要看多久_java_04

按官方说明将工程导入idea

spring源码几天能读完 spring源码要看多久_spring_05

官方操作步骤:

spring源码几天能读完 spring源码要看多久_java_06

 首选预编译根目录执行: ./gradlew :spring-oxm:compileTestJava`,不出意外直接报错:

spring源码几天能读完 spring源码要看多久_maven_07

 由于Spring Framework 6基于JDK 17构建。换句话讲,若想使用Spring Framework 6那么你的JDK环境最低要求JDK 17。好吧,我本地电脑环境是JDK1.8,所使用的的IDEA也是2019.2.3根本不支持JDK17。因此判断需升级环境,于是安装JDK17,并下载了最新版IDEA2022.3。环境准备完之后,按上述博客修改以下配置:

修改spring-framework-6.0.2\gradle\wrapper\gradle-wrapper.properties

下载对应版本的gradle,将distributionUrl修改为本地文件

# distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
distributionUrl=file\:///E:/opensource/gradle-7.5.1-all.zip

spring源码几天能读完 spring源码要看多久_spring_08

 接着修改settings.gradle,加入阿里云仓库

pluginManagement {
	repositories {
		maven { url "https://maven.aliyun.com/repository/central" }
		mavenCentral()
		gradlePluginPortal()
		maven { url "https://repo.spring.io/release" }
	}
}

修改完以后,打开新版本的idea导入项目

修改项目JDK版本为JDK17

spring源码几天能读完 spring源码要看多久_spring源码几天能读完_09

修改gradle的JVM版本为JDK17

spring源码几天能读完 spring源码要看多久_maven_10

然后就是一个漫长无比的编译过程...中途去开了个会

spring源码几天能读完 spring源码要看多久_java_11

最后编译成功,可以愉快的阅读源码了。