Spring5源码1-总体架构体系和源码环境搭建

805 阅读4分钟

欢迎大家关注 github.com/hsfxuebao ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈

1. Spring架构体系总体介绍

Spring从2004年诞生;到现在已有十几年的历史了,它也有由最初的一个简单框架,演变成了今天的一个生态 那么,Spring正是这个生态一个核心,或者说是基础 。接下来,我们就一起来看下,Spring的整体架构到底是什么样的

1.1 Spring架构分层模型

Spring总体架构图如下(4层):

image.png

数据访问与集成

  • spring-jdbc:提供JDBC主要实现模块,用于简化JDBC操作
  • spring-tx:spring-jdbc事务管理
  • spring-orm:主要集成Hibernate5,jpa
  • spring-oxm:将java对象映射成xml数据或将xml映射为java对象
  • spring-jms:发送和接受消息(MQ)web模块:
  • spring-web:提供了最基础的web支持,主要建立在核心容器上
  • spring-webmvc:实现了spring mvc的web应用
  • spring-websocket:主要与前端页的全双工通讯协议
  • spring-webflflux:一个新的非阻塞式Web框架(5.0中引入)

切面编程

  • spring-aop:面向切面编程,CGLB,JDKProxy
  • spring-aspects:集成AspectJ,Aop应用框架
  • spring-instrument(工具):动态Class Loading模块
  • spring-messaging:4.0加入的模块,主要集成基础报文传送应用

核心模块

  • spring-core:核心模块;供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC) 和依赖注入(Dependency Injection,DI)功能
  • spring-beans:Bean:提供了BeanFactory,是工厂模式的一个经典实现
  • spring-context:上下文,即IOC容器(ApplicationContext)
  • spring-context-support:对IOC的扩展,以及IOC子容器
  • spring-context-indexer:类管理组件和Classpath扫描
  • spring-expression:表达式语句

测试

  • spring-test:测试组件(JUnit、Mock)

1.2 Spring模块依赖关系

image.png

对应的源码工程:

  • spring-jcl:日志框架
  • spring-jms:消息框架(mq的集成)
  • spring-webflux非阻塞函数式Reactive Web框架

2. 源码环境搭建

2.0 什么是gradle

Gradle是一个项目自动化构建工具。
是Apache的一个基于Ant 和Maven的软件,用于项目的依赖管理。

项目的构建经历了三个时代:

  • Apache Ant(2000 年左右)
  • Maven(2004年)
  • Gradle(2012 年左右)

Spring(5.0开始) 等优秀的开源项目都将自己的项目从 Maven 迁移到了 Gradle Google 官方 Android 开发的 IDE Android Studio 也默认使用了 Gradle 进行构建。

2.1 版本选择

  • JDK8
  • Spring-framework 5.3.x
  • Intellij IDEA 2020.1

2.2 下载地址

JDK:www.oracle.com/java/techno…

gradle:gradle.org/releases/

Spring-framework:github.com/spring-proj…

2.2.1 Spring5.3 版本下载

image.png

下载完成后解压:解压之后的压缩包,当前只需要关注这四个文件

  • build.gradle:类似于 maven 的 pom.xml
  • settings.gradle:用于指示Gradle在构建应用时应将哪些模块包含在内;
  • gradle.properties:主要是gradle 的一些属性配置,例如后台进程内存大小;
  • import-into-idea.md:官方提供的spring源码导入idea的步骤和注意说明

2.2.1.1 修改配置

  • 修改 settings.gradle 文件,添加上阿里云的 maven 仓库

    maven { url "https://maven.aliyun.com/repository/public" }
    

    image.png

  • 修改gradle.properties文件(这里可以不用改,也可以编译成功)

    version=5.3.22-SNAPSHOT
    ## 设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出
    org.gradle.jvmargs=-Xmx2048m
    ## 开启 Gradle 缓存
    org.gradle.caching=true
    ## 开启并行编译
    org.gradle.parallel=true
    kotlin.stdlib.default.dependency=false
    
  • 修改build.gradle文件,加上使用阿里云仓库

    maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
    maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
    

    image.png

2.2.1.2 将源码导入 idea

导入过程就不说了,打开idea,配置配置我们本地环境的 gradle

image.png

2.2.2 gradle下载

导入spring5源码的时候,会自动下载gradle的版本,建议大家直接让idea去拉取gradle的版本(我们配置了阿里云镜像,大概十几分钟),gradle的版本和spring5的版本不匹配,会有各种各样的问题,建议大家这么操作。

2.2.2.1 本地下载

这一步一定要注意一点,你的gradle版本不要自己去搜索最新版本的安装,一定要按照你clone下来的代码中官方所用的版本来,具体到这里,在clone下来的代码对应分支的gradle包下,有一个gradle-wrapper.properties文件中的如下参数指定:

image.png

2.3 编译工程

先编译子模块 spring-core和spring-oxm模块:

image.png

然后编译整个工程。如果编译没有报错,那就说明我们已经成功了: image.png

2.4 验证

2.4.1 创建一个自己的module项目

image.png 名称为springsource-study。

从其他子module中拷贝 spring-context的依赖,build.gradle如下:

plugins {
    id 'java-library'
}

group 'org.springframework'
version '5.3.22-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    api(project(":spring-context"))

    // https://mvnrepository.com/artifact/org.projectlombok/lombok
    compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.14'


}

task createDirs {
    sourceSets*.java.srcDirs*.each {
        it.mkdirs()
    }
    sourceSets*.resources.srcDirs*.each{
        it.mkdirs()
    }
}

总结一下我遇到的坑:

  • 新建gradle项目,plugins中的id为“java”,导致依赖不成功,必须改成“java-library”,跟gradle的版本有关系
  • 在新建gradle项目时,没有src目录,需要导入下面,然后编译就可以自动生成src目录了。
    task createDirs {
        sourceSets*.java.srcDirs*.each {
            it.mkdirs()
        }
        sourceSets*.resources.srcDirs*.each{
            it.mkdirs()
        }
    }
    

创建Person类:

public class Person {

   private String name;

   public void setName(String name) {
      this.name = name;
   }

}

创建beans.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean  class="com.hsf.spring.beans.Person" id="person">
      <property name= "name" value="zhangsan"></property>
   </bean>
</beans>

创建测试类:

public class MainText {

   public static void main(String[] args) {
      ClassPathXmlApplicationContext context =
            new ClassPathXmlApplicationContext("beans.xml");
      Person bean = context.getBean(Person.class);
      System.out.println(bean);

   }

执行结果如下: image.png

github的源码地址如下:github.com/hsfxuebao/s…

参考文章

Spring5源码注释github地址
Spring源码深度解析(第2版)
spring源码解析