Spring源码分析(一)Spring的环境搭建与架构
本图:川西旅游中拍摄的(业余摄影) 官网: Home 参考书籍: Spring源码深度解析-郝佳编著-微信读书
信息
建议先熟悉一下Spring的基本知识,这样对源码的理解会更加深刻,不然无法理解其中的设计思想 作者本人就是,在看到Bean的定义是时候,一脸懵逼,不知道这是干嘛的,后面看了一下Spring的基本知识,再回来看源码,就豁然开朗了
一 Spring的基本信息
1.1 Spring 概述
Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架,Spring核心是IOC和AOP。 Spring主要优点包括:
- 方便解耦,简化开发,通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码造成的程序耦合度高。
- AOP编程的支持,通过Spring提供的AOP功能,方便进行面向切面编程。
- 声明式事务的支持,在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
- 方便程序的测试,可以用非容器依赖的编程方式进行几乎所有的测试工作。
- 方便集成各种优秀框架,Spring提供了对各种优秀框架的直接支持。
1.2 架构
整个spring框架按其所属功能可以划分为五个主要模块,这五个模块几乎为企业应用提供了所需的一切,从持久层、业务层到表现层都拥有相应的支持,这就是为什么称Spring是一站式框架的原因。 🔷核心模块(Core Container)
- Spring的核心模块实现了IoC的功能,它将类和类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述,由IoC容器负责类的创建,管理,获取等。BeanFactory接口是Spring框架的核心接口,实现了容器很多核心的功能。
- Context模块构建于核心模块之上,扩展了BeanFactory的功能,包括国际化,资源加载,邮件服务,任务调度等多项功能,ApplicationContext是Context模块的核心接口。
- 表达式语言(Expression Language)是统一表达式语言(EL)的一个扩展,支持设置和获取对象属性,调用对象方法,操作数组、集合等,使用它可以很方便的通过表达式和Spring IoC容器进行交互。
🔷AOP模块
- Spring AOP模块提供了满足AOP Alliance规范的实现,还整合了AspectJ这种AOP语言级的框架,通过AOP能降低耦合。
🔷数据访问集成模块(Data Access/Integration )
- 事务模块:该模块用于Spring管理事务,只要是Spring管理对象都能得到Spring管理事务的好处,无需在代码中进行事务控制了,而且支持编程和声明性的事务管理。
- JDBC模块:提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。
- ORM模块:提供与流行的“对象-关系”映射框架的无缝集成,包括hibernate、JPA、MyBatis等。而且可以使用Spring事务管理,无需额外控制事务。
- OXM模块:提供了一个对Object/XML映射实现,将Java对象映射成XML数据,或者将XML数据映射成java对象,Object/XML映射实现包括JAXB、Castor、XMLBeans和XStream。
- JMS模块:用于JMS(Java Messaging Service),提供一套“消息生产者、消息消费者”模板用于更加简单的使用JMS,JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
🔷Web模块
- 该模块建立在ApplicationContext模块之上,提供了Web应用的功能,如文件上传、FreeMarker等,Spring可以整合Struts2等MVC框架。此外,Spring自己提供了MVC框架Spring MVC。
🔷测试模块
- Spring可以用非容器依赖的编程方式进行几乎所有的测试工作,支持JUnit和TestNG等测试框架。
二 环境搭建
参考文章:Spring 5.2.x 源码环境搭建(Windows 系统环境下)
2.1 gradle的安装与配置
➡️官方:Gradle | Releases 我这里下载的是5.6.4 :Gradle | Thank you for downloading Gradle!
- 下载解压到指定目录
- 配置环境变化
GRADLE_HOME:自己的安装目录 GRADLE_USER_HOME:仓库地址 %GRADLE_HOME%\bin
- 验证
2.2 Spring源码构建
源码地址:https://github.com/spring-projects/spring-framework/tree/5.2.x 这里我们以5.2版本源码构建
- 在编译过程中,Spring 会自动下载依赖包,默认使用的是官方镜像,下载比较慢,所以我们提前添加好国内镜像,将下面这行代码粘贴到 build.gradle 文件中的 repositories
//添加阿里云镜像
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
- 点击gradlew.bat完成源码的初步构建
- idea 配置,我这里是2022的,其余版本可能有不一样的
- 给 Gradle 配置国内镜像
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
def url = repo.url.toString()
if ((repo instanceof MavenArtifactRepository) && (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com'))) {
project.logger.lifecycle 'Repository ${repo.url} replaced by $REPOSITORY_URL .'
remove repo
}
}
maven {
url REPOSITORY_URL
}
}
}
- 进入Idea 进行依赖的下载,知道入下图才是源码构建成功
到了这我们基本的源码分析环境就搭建完毕了,下面我们来分析源码,从源码中吸收优秀的思想以及设计,后面我的建议可以用平常的Maven环境来进行源码的分析