菜单

Spring 框架。

相关源文件

Spring Framework 是一个全面、轻量级且广泛使用的 Java 应用程序开发框架。它为开发 Java 应用程序提供基础设施支持,处理依赖管理、事务处理、 Web 应用程序开发等复杂任务。本页面旨在全面介绍 Spring Framework 的核心、关键组件和基本概念。

有关基于 Spring Framework 构建的 Spring Boot 的信息,请参阅 Spring Boot

Spring Framework 简介

Spring Framework 是一个开源应用程序框架,为 Java 应用程序提供了简化且高效的编程模型。Spring 于 2004 年首次发布,因其专注于简化企业应用程序开发而成为最受欢迎的 Java 框架之一。

Spring Framework 的核心原则包括:

  • 非侵入性:Spring 不需要您实现特定接口或继承特定类
  • 依赖注入 (DI):Spring 通过控制反转 (IoC) 管理对象依赖
  • 面向切面编程 (AOP):Spring 提供方法来分离横切关注点
  • 框架集成:Spring 可轻松与其他框架集成,如 Hibernate、JPA 等
  • 轻量级:最大限度地减少开销并提供简化的解决方案

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md17-30

Spring Framework 架构

Spring Framework 由多个提供特定功能的模块组成。下图显示了 Spring Framework 的主要模块

核心容器

核心容器是 Spring Framework 的基础,包含:

  • spring-core:框架的基本部分,包括 IoC 和 DI 功能
  • spring-beans:包含 BeanFactory,这是工厂模式的复杂实现
  • spring-context:建立在 Core 和 Beans 之上,提供应用程序上下文、JNDI、EJB 和远程处理支持
  • spring-expression:提供强大的表达式语言,用于在运行时操作对象

AOP 和 Aspects

  • spring-aop:在 Spring 中提供 AOP 功能
  • spring-aspects:与 AspectJ(一个强大的 AOP 框架)集成
  • spring-instrument:添加了检测支持(很少直接使用)

数据访问/集成

  • spring-jdbc:JDBC 抽象层,消除了繁琐的 JDBC 编码
  • spring-orm:ORM API(如 JPA、Hibernate)的集成层
  • spring-tx:编程和声明式事务管理
  • spring-oxm:对象/XML 映射抽象
  • spring-jms:消息服务支持

Web

  • spring-web:基本的 Web 相关集成功能
  • spring-webmvc:Spring 的模型-视图-控制器实现,用于 Web 应用程序
  • spring-websocket:WebSocket 和 SockJS 实现
  • spring-webflux:响应式堆栈 Web 框架(Spring 5+)

测试

  • spring-test:支持 Spring 组件的单元测试和集成测试

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md35-80

Spring、Spring MVC 和 Spring Boot 之间的关系

许多开发人员对 Spring、Spring MVC 和 Spring Boot 之间的关系感到困惑。它们的关系如下:

  • Spring Framework 包含多个模块,包括 Spring MVC、Spring Core、Spring Data 等。
  • Spring MVC 是 Spring Framework 中的一个特定模块,实现了用于 Web 应用程序的模型-视图-控制器模式。
  • Spring Boot 构建在 Spring Framework 之上,提供简化的配置和一种约定俗成的开发方式,只需最少的精力即可构建生产就绪的应用程序。

Spring Boot 并未取代 Spring — 它通过提供自动配置、嵌入式服务器和启动依赖项,使其更易于使用。

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md91-107

Spring IoC (控制反转)

控制反转 (IoC) 是 Spring Framework 的一个基本原则。它指的是将直接的依赖管理从应用程序代码中移除,并将其委托给框架。

IoC 容器

IoC 容器负责:

  • 创建 Bean
  • 管理 Bean 生命周期
  • 注入依赖
  • 管理 Bean 作用域

Spring 的 IoC 容器通过以下方式实现:

  • BeanFactory:基本实现,延迟加载 Bean
  • ApplicationContext:建立在 BeanFactory 之上的高级容器,增加了企业级功能

Bean 定义

Spring Bean 只是一个由 Spring IoC 容器管理的 Bean。Bean 定义告诉容器如何创建、配置和组装 Bean。

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md112-129

Bean 生命周期

Spring Bean 的生命周期很复杂,涉及许多步骤。

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md454-470

Bean 作用域

Spring 支持多种 Bean 作用域:

范围描述
singleton(单例)默认作用域。每个 Spring 容器一个实例
prototype(原型)每次请求时创建新实例
request(请求)每个 HTTP 请求一个实例(Web 应用程序)
session(会话)每个 HTTP 会话一个实例(Web 应用程序)
application(应用程序)每个 ServletContext 一个实例(Web 应用程序)
websocket(WebSocket)每个 WebSocket 会话一个实例

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md354-363

依赖注入

Spring 支持三种类型的依赖注入:

  1. 构造函数注入:通过构造函数提供依赖

  2. Setter 注入:通过 Setter 方法提供依赖

  3. 字段注入:直接注入到字段的依赖(不推荐用于生产代码)

Spring 官方推荐使用构造函数注入来处理必需的依赖,因为它可以:

  • 确保对象创建时的依赖完整性
  • 促进不变性
  • 使组件更容易测试

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md282-349

Spring AOP (面向切面编程)

面向切面编程 (AOP) 允许将横切关注点与业务逻辑分离。常见示例包括日志记录、安全性和事务管理。

Spring AOP 通过在目标对象周围创建代理来工作。它使用以下两种方式之一:

  • JDK 动态代理:当目标实现接口时
  • CGLIB 代理:当目标不实现接口时

关键 AOP 概念

  • Aspect:一种横切多个类的关注点的模块化(例如日志记录)
  • Join Point:程序执行期间,切面可以插入的点
  • Advice:切面在特定连接点采取的行动
  • Pointcut:匹配连接点以确定何时执行 Advice 的表达式
  • Target:正在被通知的对象
  • Proxy:由 AOP 框架创建的用于实现切面合同的对象
  • Weaving:将切面与应用程序对象链接的过程

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md562-603

Advice 类型

Spring AOP 支持不同类型的 Advice:

  • Before:在方法执行前执行
  • After:在方法执行后执行(无论结果如何)
  • AfterReturning:在成功完成后执行
  • AfterThrowing:如果在方法中抛出异常则执行
  • Around:最强大,可以完全控制方法的执行

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md602-611

Spring MVC

Spring MVC 是一个基于模型-视图-控制器设计模式的 Web 框架。它是 Spring 中用于构建 Web 应用程序的最广泛使用的模块之一。

MVC 架构

Spring MVC 组件

关键组件

  • DispatcherServlet:管理请求流程的前端控制器
  • HandlerMapping:将请求映射到处理器
  • HandlerAdapter:执行处理器
  • Controller:处理请求、创建模型
  • ViewResolver:将视图名称解析为实际视图
  • View:渲染模型数据

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md642-691

Spring MVC 中的请求流程

Spring MVC 中的请求流程:

  1. 客户端向服务器发送请求
  2. DispatcherServlet 接收请求
  3. DispatcherServlet 咨询 HandlerMapping 来识别控制器
  4. Controller 处理请求,创建并填充模型,返回视图名称
  5. DispatcherServlet 咨询 ViewResolver 来识别视图
  6. View 渲染模型数据
  7. 响应被发送回客户端

在具有 REST API 架构的现代应用程序中,流程被简化了,因为控制器直接返回数据(通常是 JSON),而无需进行视图解析。

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md693-715

Spring 事务管理

Spring 提供了出色的事务管理功能。事务确保数据库操作要么完全完成,要么完全失败,从而维护数据完整性。

事务管理方法

Spring 支持两种类型的事务管理:

  1. 编程事务管理:在代码中显式管理事务

  2. 声明式事务管理:使用注解或 XML 配置

声明式事务管理更受青睐,因为它将事务逻辑与业务代码分离。

来源: docs/system-design/framework/spring/spring-transaction.md87-151

事务传播行为

事务传播行为定义了当方法调用其他方法时,事务之间如何相互关联。

Propagation描述
REQUIRED (必需)如果存在现有事务,则使用现有事务;否则创建新事务(默认)
REQUIRES_NEW (需要新事务)始终创建一个新事务,如果存在当前事务则挂起
SUPPORTS (支持)如果存在现有事务,则使用现有事务;否则以非事务方式运行
NOT_SUPPORTED (不支持)以非事务方式运行,如果存在当前事务则挂起
MANDATORY (强制)使用现有事务;如果不存在则抛出异常
NEVER (从不)以非事务方式运行;如果存在事务则抛出异常
NESTED (嵌套)如果存在当前事务,则在嵌套事务中执行

来源: docs/system-design/framework/spring/spring-transaction.md282-481

事务隔离级别

事务隔离级别决定了并发事务所做的更改对彼此的可见性。

隔离级别描述
默认使用数据库的默认隔离级别
READ_UNCOMMITTED (读未提交)允许脏读、不可重复读和幻读
READ_COMMITTED (读已提交)防止脏读,但允许不可重复读和幻读
REPEATABLE_READ (可重复读)防止脏读和不可重复读,但允许幻读
SERIALIZABLE (串行化)防止所有并发问题,但性能最低

来源: docs/system-design/framework/spring/spring-transaction.md497-550

Spring Framework 中的设计模式

Spring Framework 融入了多种设计模式。

设计模式在 Spring 中的应用
工厂模式BeanFactory 使用工厂模式来创建对象
单例模式Spring Bean 的默认作用域
原型模式原型作用域的 Bean
代理模式Spring AOP 和事务管理的核心
模板方法模式JdbcTemplate、HibernateTemplate 等
前端控制器Spring MVC 中的 DispatcherServlet
视图助手Spring MVC 中的 ViewResolver
依赖注入贯穿 Spring 的核心概念
面向切面编程Spring AOP 模块

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md771-782

Spring 处理常见挑战

循环依赖

Spring 在大多数情况下通过以下方式自动解决循环依赖:

  • 用于单例 Bean 的三级缓存机制
  • Bean 代理的创建

但是,构造函数注入的循环依赖无法自动解决,需要重新设计组件。

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md784-891

异常处理

Spring 提供了强大的异常处理机制,尤其是在 Web 应用中。

这允许在整个应用程序中进行集中式异常处理。

来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md722-744

结论

Spring Framework 为开发 Java 应用程序提供了一个全面的基础设施,其功能简化了常见的开发任务。其模块化架构允许开发人员仅使用他们需要的组件。该框架一致的编程模型基于依赖注入和声明式编程,能够促进代码更易于测试、维护和扩展。

作为 Spring 生态系统的基础,本页面涵盖的核心 Spring Framework 概念对于理解 Spring Boot、Spring Data、Spring Security 等更专业的项目至关重要。