Spring框架学习总结

1. Spring框架概述

什么是Spring框架

Spring是一个开源的Java企业级应用开发框架,为Java应用程序提供全面的基础设施支持。

核心特性

  • 依赖注入 (DI) - 通过控制反转(IoC)容器管理对象的创建和依赖关系
  • 面向切面编程 (AOP) - 支持横切关注点的模块化
  • 事务管理 - 提供声明式和编程式事务管理

主要模块

  • Spring Core - 核心容器,提供IoC和DI功能
  • Spring Boot - 简化Spring应用的配置和部署
  • Spring MVC - Web应用开发框架
  • Spring WebFlux - 响应式Web框架
  • Spring Data - 数据访问抽象层
  • Spring Security - 安全框架

2. Java企业级应用

定义

使用Java技术栈构建的大型、复杂的商业应用系统。

核心特征

  • 支持大量并发用户
  • 处理海量数据
  • 复杂的业务逻辑和工作流
  • 高可用性和可靠性
  • 安全性和权限控制

典型架构

  • 表示层(Web界面)
  • 业务逻辑层(服务层)
  • 数据访问层(DAO/Repository)
  • 数据库层

3. Java版本演进

Java EE版本历史

  • J2EE 1.2-1.4 (1999-2003) - 早期版本
  • Java EE 5-8 (2006-2017) - Oracle时代
  • Jakarta EE 8-11 (2019-2024) - Eclipse基金会时代

主流应用现状

  • Spring Boot - 占主导地位(70%+市场份额)
  • Jakarta EE 8 - 最广泛使用的企业版本
  • Java 17+ - 现代应用推荐版本

技术选择建议

  • 新项目: Spring Boot 3.x(基于Java 17+)
  • 现有项目: 逐步升级到Jakarta EE 10

4. Spring产品生态

Web开发

  • Spring MVC - 传统Web应用开发
  • Spring WebFlux - 响应式Web框架

微服务

  • Spring Cloud - 微服务架构解决方案
  • Spring Cloud Gateway - API网关服务

数据访问

  • Spring Data JPA - 关系型数据库
  • Spring Data MongoDB - NoSQL数据库
  • Spring Data Redis - 缓存

其他组件

  • Spring Security - 安全框架
  • Spring Batch - 批处理框架
  • Spring Integration - 企业集成

5. RESTful API开发

技术栈选择

传统同步API

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

高并发异步API

implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'

完整技术选型

  • 基础层: Spring Boot 3.x + Spring Web/WebFlux
  • 数据库: MySQL/PostgreSQL + JPA/R2DBC
  • 缓存: Redis
  • 安全: Spring Security + JWT
  • 文档: SpringDoc OpenAPI

6. 响应式编程 vs JavaScript异步

JavaScript异步模型

  • 单线程事件循环 - 基于回调队列
  • Promise/async-await - 处理单个异步值
  • 主要解决回调地狱问题

Reactor响应式编程

  • 数据流处理 - 基于发布-订阅模式
  • Mono/Flux - 处理0-1个或0-N个异步值流
  • 背压控制 - 处理生产者消费者速度不匹配

关键区别

  • JavaScript: 主要处理单个异步操作
  • Reactor: 处理连续的数据流,支持流式操作

7. Reactor响应式流处理

数据流概念

将数据作为连续的流来处理,而不是单个值。

流式操作示例

// 处理用户列表流
Flux<User> users = userRepository.findAll();

Flux<String> processedUsers = users
    .filter(user -> user.isActive())          // 过滤活跃用户
    .map(user -> user.getName().toUpperCase()) // 转换名称
    .take(10)                                 // 只取前10个
    .doOnNext(name -> log.info("Processing: {}", name)); // 副作用操作

接收方式

  1. Controller直接返回 - Spring WebFlux自动处理
  2. subscribe()订阅 - 异步处理
  3. 阻塞获取 - .block()(不推荐)
  4. 链式处理 - 流式操作

8. 前端接收响应式API

关键点

  • 前端无需知道后端是否使用响应式
  • HTTP协议保持不变
  • 响应格式完全一致
  • Spring WebFlux自动将Mono/Flux转换为标准HTTP响应

前端调用示例

// 调用响应式API - 前端无感知
fetch('/jobs/123/status')
  .then(response => response.json())
  .then(data => console.log('Job status:', data));

9. Spring MVC vs Spring WebFlux

Spring MVC(传统同步)

  • Servlet容器(Tomcat、Jetty)
  • 阻塞I/O模型
  • 每个请求一个线程
  • RestTemplate(同步HTTP客户端)

Spring WebFlux(响应式异步)

  • Netty或Servlet 3.1+容器
  • 非阻塞I/O模型
  • 事件循环线程模型
  • WebClient(响应式HTTP客户端)

容器区别

Servlet容器(Tomcat)

  • 线程模型: 每个请求一个线程
  • I/O模式: 阻塞I/O
  • 扩展性: 高并发时线程耗尽
  • 内存消耗: 每个线程约1MB栈空间

Netty容器

  • 线程模型: 事件循环模型
  • I/O模式: 非阻塞I/O
  • 扩展性: 少量线程处理大量连接
  • 内存消耗: 低内存占用

10. Web容器与Docker

基本概念区别

  • Tomcat(Web容器): Java应用服务器,处理HTTP请求
  • Docker(容器化技术): 应用打包和部署平台

架构层次关系

┌─────────────────────────────┐
│      Docker容器             │
│  ┌─────────────────────────┐│
│  │    Spring应用           ││
│  ├─────────────────────────┤│
│  │    Tomcat Web容器       ││
│  ├─────────────────────────┤│
│  │    Java运行时           ││
│  └─────────────────────────┘│
└─────────────────────────────┘

11. 控制反转(IoC)

核心概念

IoC是Inversion of Control(控制反转)的缩写,是一种设计原则。

传统方式 vs IoC方式

// 传统方式 - 正向控制
public class UserService {
    private UserRepository userRepository = new UserRepository(); // 自己创建
}

// IoC方式 - 控制反转
public class UserService {
    @Autowired
    private UserRepository userRepository; // 框架注入
}

IoC的好处

  • 解耦合 - 降低组件间依赖
  • 易于测试 - 可注入Mock对象
  • 配置灵活 - 运行时决定实现

12. 面向切面编程(AOP)

核心概念

AOP用于处理横切关注点(日志、安全、事务、性能监控等)。

传统方式问题

每个方法都要重复写日志、安全检查等代码。

AOP解决方案

// 业务类只关注业务逻辑
@LogExecutionTime
@RequirePermission
public User createUser(User user) {
    return userRepository.save(user); // 只写业务逻辑
}

// 切面类处理横切关注点
@Aspect
@Component
public class LoggingAspect {
    @Around("@annotation(LogExecutionTime)")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        // 日志处理逻辑
    }
}

AOP核心术语

  • 切面(Aspect) - 横切关注点的模块化
  • 连接点(Join Point) - 程序执行的特定点
  • 切入点(Pointcut) - 定义在哪些地方切入
  • 通知(Advice) - 在连接点执行的代码

13. 项目实践总结

架构选择建议

  1. 保持现有架构 - Servlet + Spring MVC,稳定可靠
  2. 混合方案 - 保持Servlet栈,使用WebClient的阻塞模式
  3. 完全响应式 - 移除MVC依赖,使用纯WebFlux + Netty

技术栈对比

特性 Spring MVC + Tomcat Spring WebFlux + Netty
编程模型 同步阻塞 异步非阻塞
学习成本
并发性能 中等
内存使用
适用场景 传统企业应用 高并发API服务