跳到主要内容

Spring源码分析(一)Spring的环境搭建与架构

a32e41535150d5a4efb0608c283d501.jpg 本图:川西旅游中拍摄的(业余摄影) 官网: 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是一站式框架的原因。 image.png 🔷核心模块(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!

  • 下载解压到指定目录

image.png

  • 配置环境变化

GRADLE_HOME:自己的安装目录 image.png GRADLE_USER_HOME:仓库地址 image.png %GRADLE_HOME%\bin image.png

  • 验证

image.png

2.2 Spring源码构建

源码地址:https://github.com/spring-projects/spring-framework/tree/5.2.x image.png 这里我们以5.2版本源码构建

  • 在编译过程中,Spring 会自动下载依赖包,默认使用的是官方镜像,下载比较慢,所以我们提前添加好国内镜像,将下面这行代码粘贴到 build.gradle 文件中的 repositories
//添加阿里云镜像
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }

image.png image.png

  • 点击gradlew.bat完成源码的初步构建

image.png

  • idea 配置,我这里是2022的,其余版本可能有不一样的

image.png

  • 给 Gradle 配置国内镜像

image.png image.png

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 进行依赖的下载,知道入下图才是源码构建成功

image.png 到了这我们基本的源码分析环境就搭建完毕了,下面我们来分析源码,从源码中吸收优秀的思想以及设计,后面我的建议可以用平常的Maven环境来进行源码的分析