Spring源码深度解析二-Spring源码如何导入?

大家好,上章介绍了Spring的一些常识。今天我们就从一个demo开始入手,讲解Spring的源码如何导入,怎么一步一步的查看Spring的启动流程。本次讲解源码以Spring5.1.3版本为例

一、准备工作

1、安装JDK1.8版本。

2、 因为Spring源码是使用gradle进行构建的,所以需要安装配置gradle。

3、Spring源码下载

  1. 下载spring源码包,git clone https:///spring-projects/spring-framework
  2. 到下载的spring源码路径执行gradle命令,gradlew :spring-oxm:compileTestJava,编译Spring源码
  3. 用idea打开spring源码工程,在idea中安装插件kotlin,重启idea
  4. 把编译好的源码导入到工程中

二、开始搭建一个Spring项目

1、新建一个maven项目

spring将文件流写入到response spring导入_spring源码

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>

spring将文件流写入到response spring导入_spring入门_02

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

spring将文件流写入到response spring导入_JAVA_03

2、lib替换

在classes选择+号,选择源码中编译好的lib包。

spring将文件流写入到response spring导入_Spring_04

3、Source替换

在source栏点击+号,选择源码包目录

spring将文件流写入到response spring导入_JAVA_05

四、执行测试用例

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将文件流写入到response spring导入_spring demo_06


spring将文件流写入到response spring导入_spring入门_07

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