Spring 中有哪些设计模式?

🧠 一、Spring 中常见的设计模式

设计模式 类型 Spring 中的应用场景
单例模式 创建型 默认 Bean 是单例的
工厂模式 创建型 BeanFactoryFactoryBean
抽象工厂模式 创建型 ApplicationContext 提供多个工厂接口
代理模式 结构型 AOP 动态代理(JDK/CGLIB)
模板方法模式 行为型 JdbcTemplateTransactionTemplate
观察者模式 行为型 ApplicationEventPublisher、事件监听
策略模式 行为型 Bean 的多实现组合(如多种验证器)
适配器模式 结构型 HandlerAdapterViewResolver
装饰器模式 结构型 BeanPostProcessor、Filter 链式处理
责任链模式 行为型 Spring MVC 的拦截器链、Filter 链
原型模式 创建型 @Scope("prototype") Bean 每次创建新实例
建造者模式 创建型 BeanDefinitionBuilder 构建 Bean 配置
组合模式 结构型 BeanFactory 管理多个 Bean、容器组合结构

🚀 二、常见设计模式详解举例

1️⃣ 单例模式:默认 Bean 模式

java 复制代码
@Component
public class UserService {}

Spring 默认所有 Bean 都是单例,容器只创建一次,整个项目中共用同一实例。

2️⃣ 工厂模式 & 抽象工厂模式

  • BeanFactory 是顶层工厂
  • ApplicationContext 是功能更强大的"抽象工厂"
  • FactoryBean 是 Spring 中的一种特殊 Bean
java 复制代码
@Component
public class MyFactoryBean implements FactoryBean<MyBean> {
    public MyBean getObject() {
        return new MyBean(); // 自定义创建逻辑
    }
}

3️⃣ 代理模式:AOP 的核心

使用 JDK 动态代理或 CGLIB 生成目标类的代理对象,增强原方法逻辑。

java 复制代码
@Around("execution(* com.example..*Service.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("方法执行前");
    Object result = joinPoint.proceed();
    System.out.println("方法执行后");
    return result;
}

4️⃣ 模板方法模式:JdbcTemplate 就是经典代表

java 复制代码
jdbcTemplate.query("SELECT * FROM users", rs -> {
    // 回调方法就是自定义部分
});

固定的执行流程(打开连接 → 执行 → 关闭),回调中只关注"变化点"。

5️⃣ 观察者模式:Spring 事件机制

java 复制代码
applicationContext.publishEvent(new MyCustomEvent(...));

所有 ApplicationListener 都会接收到事件回调,实现异步解耦。

6️⃣ 责任链模式:拦截器链、Filter 链

Spring MVC 中的 HandlerInterceptor 实现链式执行:

java 复制代码
preHandle() → Controller → postHandle() → afterCompletion()

📦 三、为什么 Spring 用这么多设计模式?

  1. 解耦:控制反转、代理、事件等机制让组件之间低耦合
  2. 复用性强:模板方法、策略等让开发者只写差异部分
  3. 扩展性好:BeanPostProcessor、HandlerMapping 都可拓展
  4. 代码清晰:职责分明、结构层次清楚

✅ 总结一句话:

Spring 是一个把面向对象设计模式发挥到极致的框架。掌握设计模式,等于读懂 Spring 背后的智慧。

相关推荐
花椒技术8 小时前
HJPusher / HJPlayer SDK 实践:我们为什么把直播推播链路拆成一套可复用能力
设计模式·harmonyos·直播
白鲸开源10 小时前
Apache SeaTunnel Zeta Engine 的 Basic Auth 是怎么工作的?
java·vue.js·github
白鲸开源10 小时前
一文读懂DolphinScheduler插件机制:如何轻松扩展任务类型与数据源
java·架构·github
用户2986985301415 小时前
Java 实现 Word 文档文本查找与高亮标注
java·后端
宇宙之一粟16 小时前
乐企版式文件生成平台
java·后端·python
plainGeekDev16 小时前
MVC 写法 → MVVM
android·java·kotlin
SL_staff17 小时前
3周搭完MES系统:JVS低代码+JVS-IoT物联网的实战记录
java·前端·低代码
MacroZheng17 小时前
斩获20w star!Claude Code最强插件,AI编程必备!
java·人工智能·后端
艺艺生辉17 小时前
迭代器模式-"我也想被增强for循环"
设计模式
唐青枫18 小时前
Java Spring WebFlux 实战指南:用 Mono、Flux 和 WebClient 写响应式接口
java·spring