• Spring源码-总体架构体系和源码环境搭建


    1. Spring架构体系总体介绍

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

    1.1 Spring架构分层模型

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

    数据访问与集成

    • 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模块依赖关系

    对应的源码工程:

    • 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 版本下载

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

    • 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" }复制代码

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

      1. version=5.3.22-SNAPSHOT
      2. ## 设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出
      3. org.gradle.jvmargs=-Xmx2048m
      4. ## 开启 Gradle 缓存
      5. org.gradle.caching=true## 开启并行编译
      6. org.gradle.parallel=truekotlin.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'}复制代码

    2.2.1.2 将源码导入 idea

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

    2.2.2 gradle下载

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

    2.2.2.1 本地下载

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

    2.3 编译工程

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

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

    2.4 验证

    2.4.1 创建一个自己的module项目

    名称为springsource-study。

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

    1. plugins {
    2. id 'java-library'
    3. }
    4. group 'org.springframework'
    5. version '5.3.22-SNAPSHOT'
    6. repositories {
    7. mavenCentral()
    8. }
    9. dependencies {
    10. api(project(":spring-context"))
    11. // https://mvnrepository.com/artifact/org.projectlombok/lombok
    12. compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.14'
    13. }
    14. task createDirs {
    15. sourceSets*.java.srcDirs*.each {
    16. it.mkdirs()
    17. }
    18. sourceSets*.resources.srcDirs*.each{
    19. it.mkdirs()
    20. }
    21. }复制代码

    总结一下我遇到的坑:

    • 新建gradle项目,plugins中的id为“java”,导致依赖不成功,必须改成“java-library”,跟gradle的版本有关系

    • 在新建gradle项目时,没有src目录,需要导入下面,然后编译就可以自动生成src目录了。

      1. task createDirs {
      2. sourceSets*.java.srcDirs*.each {
      3. it.mkdirs()
      4. }
      5. sourceSets*.resources.srcDirs*.each{
      6. it.mkdirs()
      7. }
      8. }复制代码

    创建Person类:

    1. public class Person { private String name; public void setName(String name) { this.name = name;
    2. }
    3. }复制代码

    创建beans.xml文件:

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    4. <bean class="com.hsf.spring.beans.Person" id="person">
    5. <property name= "name" value="zhangsan">property>
    6. bean>beans>复制代码

    创建测试类:

    1. public class MainText { public static void main(String[] args) { ClassPathXmlApplicationContext context =
    2. new ClassPathXmlApplicationContext("beans.xml"); Person bean = context.getBean(Person.class);
    3. System.out.println(bean);
    4. }复制代码

    执行结果如下:

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

  • 相关阅读:
    动态修改el-input样式;动态修改elmentUI元素样式;css变量
    SpringCloud Alibaba之Sentinel流量治理组件学习笔记
    OAuth2 完成用户登录【详解】(含码云 gitee 的实现范例)
    OpenGL原理与实践——核心模式(四):摄像机变换理论与应用
    第二十六章 使用任务管理器(四)
    java-php-net-python-银行招聘信息网计算机毕业设计程序
    CData Drivers for Asana复制和仓储
    Github每日精选(第68期):HTTP客户端哪家强-reqwest
    设备树(dtb数据)匹配struct machine_desc结构体
    Spring注解家族介绍:@RestController
  • 原文地址:https://blog.csdn.net/YYniannian/article/details/126242309