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)); // 副作用操作
接收方式
- Controller直接返回 - Spring WebFlux自动处理
- subscribe()订阅 - 异步处理
- 阻塞获取 - .block()(不推荐)
- 链式处理 - 流式操作
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. 项目实践总结
架构选择建议
- 保持现有架构 - Servlet + Spring MVC,稳定可靠
- 混合方案 - 保持Servlet栈,使用WebClient的阻塞模式
- 完全响应式 - 移除MVC依赖,使用纯WebFlux + Netty
技术栈对比
| 特性 | Spring MVC + Tomcat | Spring WebFlux + Netty |
|---|---|---|
| 编程模型 | 同步阻塞 | 异步非阻塞 |
| 学习成本 | 低 | 高 |
| 并发性能 | 中等 | 高 |
| 内存使用 | 高 | 低 |
| 适用场景 | 传统企业应用 | 高并发API服务 |
浙公网安备 33010602011771号