Spring从2004年诞生;到现在已有十几年的历史了,它也有由最初的一个简单框架,演变成了今天的一个生态 那么,Spring正是这个生态一个核心,或者说是基础 。接下来,我们就一起来看下,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)

对应的源码工程:
spring-jcl:日志框架
spring-jms:消息框架(mq的集成)
spring-webflux非阻塞函数式Reactive Web框架
Gradle是一个项目自动化构建工具。
是Apache的一个基于Ant 和Maven的软件,用于项目的依赖管理。
项目的构建经历了三个时代:
Apache Ant(2000 年左右)
Maven(2004年)
Gradle(2012 年左右)
Spring(5.0开始) 等优秀的开源项目都将自己的项目从 Maven 迁移到了 Gradle Google 官方 Android 开发的 IDE Android Studio 也默认使用了 Gradle 进行构建。
JDK8
Spring-framework 5.3.x
Intellij IDEA 2020.1
JDK:www.oracle.com/java/techno…
gradle:gradle.org/releases/
Spring-framework:github.com/spring-proj…

下载完成后解压:解压之后的压缩包,当前只需要关注这四个文件
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文件(这里可以不用改,也可以编译成功)
- version=5.3.22-SNAPSHOT
- ## 设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出
- org.gradle.jvmargs=-Xmx2048m
- ## 开启 Gradle 缓存
- org.gradle.caching=true## 开启并行编译
- 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

导入spring5源码的时候,会自动下载gradle的版本,建议大家直接让idea去拉取gradle的版本(我们配置了阿里云镜像,大概十几分钟),gradle的版本和spring5的版本不匹配,会有各种各样的问题,建议大家这么操作。
2.2.2.1 本地下载
这一步一定要注意一点,你的gradle版本不要自己去搜索最新版本的安装,一定要按照你clone下来的代码中官方所用的版本来,具体到这里,在clone下来的代码对应分支的gradle包下,有一个gradle-wrapper.properties文件中的如下参数指定:

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

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


名称为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文件:
- <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);
-
- }复制代码
执行结果如下:

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