Spring Framework 是一个全面、轻量级且广泛使用的 Java 应用程序开发框架。它为开发 Java 应用程序提供基础设施支持,处理依赖管理、事务处理、 Web 应用程序开发等复杂任务。本页面旨在全面介绍 Spring Framework 的核心、关键组件和基本概念。
有关基于 Spring Framework 构建的 Spring Boot 的信息,请参阅 Spring Boot。
Spring Framework 是一个开源应用程序框架,为 Java 应用程序提供了简化且高效的编程模型。Spring 于 2004 年首次发布,因其专注于简化企业应用程序开发而成为最受欢迎的 Java 框架之一。
Spring Framework 的核心原则包括:
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md17-30
Spring Framework 由多个提供特定功能的模块组成。下图显示了 Spring Framework 的主要模块
核心容器是 Spring Framework 的基础,包含:
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md35-80
许多开发人员对 Spring、Spring MVC 和 Spring Boot 之间的关系感到困惑。它们的关系如下:
Spring Boot 并未取代 Spring — 它通过提供自动配置、嵌入式服务器和启动依赖项,使其更易于使用。
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md91-107
控制反转 (IoC) 是 Spring Framework 的一个基本原则。它指的是将直接的依赖管理从应用程序代码中移除,并将其委托给框架。
IoC 容器负责:
Spring 的 IoC 容器通过以下方式实现:
Spring Bean 只是一个由 Spring IoC 容器管理的 Bean。Bean 定义告诉容器如何创建、配置和组装 Bean。
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md112-129
Spring Bean 的生命周期很复杂,涉及许多步骤。
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md454-470
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 支持三种类型的依赖注入:
构造函数注入:通过构造函数提供依赖
Setter 注入:通过 Setter 方法提供依赖
字段注入:直接注入到字段的依赖(不推荐用于生产代码)
Spring 官方推荐使用构造函数注入来处理必需的依赖,因为它可以:
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md282-349
面向切面编程 (AOP) 允许将横切关注点与业务逻辑分离。常见示例包括日志记录、安全性和事务管理。
Spring AOP 通过在目标对象周围创建代理来工作。它使用以下两种方式之一:
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md562-603
Spring AOP 支持不同类型的 Advice:
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md602-611
Spring MVC 是一个基于模型-视图-控制器设计模式的 Web 框架。它是 Spring 中用于构建 Web 应用程序的最广泛使用的模块之一。
关键组件
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md642-691
Spring MVC 中的请求流程:
在具有 REST API 架构的现代应用程序中,流程被简化了,因为控制器直接返回数据(通常是 JSON),而无需进行视图解析。
来源: docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md693-715
Spring 提供了出色的事务管理功能。事务确保数据库操作要么完全完成,要么完全失败,从而维护数据完整性。
Spring 支持两种类型的事务管理:
编程事务管理:在代码中显式管理事务
声明式事务管理:使用注解或 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 中的应用 |
|---|---|
| 工厂模式 | 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 在大多数情况下通过以下方式自动解决循环依赖:
但是,构造函数注入的循环依赖无法自动解决,需要重新设计组件。
来源: 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 等更专业的项目至关重要。
刷新此 Wiki
最后索引时间2025年4月17日(ff77b0)