欢迎大家关注 github.com/hsfxuebao ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈
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.xmlsettings.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=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'}
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如下:
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);
}
执行结果如下:
github的源码地址如下:github.com/hsfxuebao/s…
参考文章
Spring5源码注释github地址
Spring源码深度解析(第2版)
spring源码解析