Spring源码深度解析二-Spring源码如何导入?
大家好,上章介绍了Spring的一些常识。今天我们就从一个demo开始入手,讲解Spring的源码如何导入,怎么一步一步的查看Spring的启动流程。本次讲解源码以Spring5.1.3版本为例
一、准备工作
1、安装JDK1.8版本。
2、 因为Spring源码是使用gradle进行构建的,所以需要安装配置gradle。
3、Spring源码下载
- 下载spring源码包,git clone https:///spring-projects/spring-framework
- 到下载的spring源码路径执行gradle命令,gradlew :spring-oxm:compileTestJava,编译Spring源码
- 用idea打开spring源码工程,在idea中安装插件kotlin,重启idea
- 把编译好的源码导入到工程中
二、开始搭建一个Spring项目
1、新建一个maven项目

2、Spring核心组件引入
Spring中最核心的4个Jar包如下:
- spring-beans
- spring-core
- spring-context
- spring-expression
但要创建一个Spring项目,理论上最简单只需要一个Jar就够了
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
3、日志组件引入
但是一个空的Spring项目是不能打印日志的,因此需要引入Spring依赖的日志
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>LATEST</version>
</dependency>4、完整的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiangxue.jack</groupId>
<artifactId>spring-source</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring-source Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>5.1.3.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>LATEST</version>
</dependency>
</dependencies>
<build>
<finalName>spring-source</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http:///ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>5、新建Spring配置文件
XSD 是编写xml文件的一种规范,有了这个规范才能校验xml 是否写错,在spring 中同样有 XSD 规范。例如要引入自定义标签
<context:component-scan base-package=“com.xx.jack”/>
就必须引入这个标签对应的 XSD 文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
default-lazy-init="false">
<!--自定义标签-->
<context:component-scan base-package="com.spring"/>
<!--传统标签-->
<bean class="com.spring.demo.Student" id="student"/>
</beans>6、新建JAVA bean
新建一个student的bean,并为添加注解@Component,注入到Spring组件中
package com.spring.dk.bean;
@Component
public class Student {
private String username = "dk";
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}三、源码导入
spring项目已经建好了,我们接下来就需要将SPring源码导入进来,这样就可以通过一个demo进行对Spring的代码进行debug。
1、选择项目引入的依赖spring-context
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WhGdZTN9-1649598327720)(C:\Users\王正强\AppData\Roaming\Typora\typora-user-images\image-20220410212154243.png)] spring将文件流写入到response spring导入_JAVA_03](https://s2.51cto.com/images/blog/202403/16064756_65f4d01cba1a385847.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
2、lib替换
在classes选择+号,选择源码中编译好的lib包。

3、Source替换
在source栏点击+号,选择源码包目录

四、执行测试用例
1、编写Spring测试用例
package com.spring.demo.test;
import com.spring.demo.Student;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
/*
* spring
* */
@Test
public void test1() {
/*
* Spring自动扫描
* */
AnnotationConfigApplicationContext appcationContext = new AnnotationConfigApplicationContext("com.spring");
Student student = (Student) appcationContext.getBean("student");
System.out.println(student.getUsername());
}
@Test
public void test2() {
//基于xml的方式加载spring的配置文件,启动spring容器
ClassPathXmlApplicationContext appcationContext = new ClassPathXmlApplicationContext("spring.xml");
Student student = (Student)appcationContext.getBean("student");
System.out.println(student.getUsername());
}
}2、测试结果


至此,一个简单地Spring项目就搭建完成,并且引入了我们编译好的源码包,点击AnnotationConfigApplicationContext就可以跳到对应的源码处,接下来,就可以通过demo来debug源码,一步一步看Spring的执行过程了。
















