当前位置: 首页 > news >正文

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 模式

@Component
public class UserService {}

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

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

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

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

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

@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 就是经典代表

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

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

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

applicationContext.publishEvent(new MyCustomEvent(...));

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

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

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

preHandle()ControllerpostHandle()afterCompletion()

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

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

✅ 总结一句话:

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

http://www.dtcms.com/a/114721.html

相关文章:

  • python入门之从安装python及vscode开始
  • 功耗日志抓取需求
  • (六)安卓开发中的Activity的启动、关闭和生命周期详解
  • 目录遍历(Directory traversal)漏洞总结
  • keepalived高可用介绍
  • VLAN(虚拟局域网)
  • 机器学习之数据预处理(一):缺失值处理和异常值识别的几种常用方法
  • ER-图,详情和画法
  • Windows操作系统安全配置(一)
  • 关于计算机网络的一些疑问
  • 新一代AI架构实践:数字大脑AI+智能调度MCP+领域执行APP的黄金金字塔体系
  • 批量将 Markdown 转换为 Word/PDF 等其它格式
  • react和vue在开发使用的语法上面有什么区别?
  • 自动微分模块
  • SpringSecurity框架入门
  • (自用)WebSocket创建流程
  • oracle批量删除分区
  • 【船舷外机】行业研究
  • 数据结构学习-第一天
  • 【注解简化配置的原理是什么】
  • springboot-ai接入DeepSeek
  • NO.71十六届蓝桥杯备战|搜索算法-递归型枚举与回溯剪枝|枚举子集|组合型枚举|枚举排列|全排列问题(C++)
  • SpringBoot自动装配原理---Spring
  • import cv2 安装失败
  • 语法: value=label_address( label);
  • PyTorch池化层详解:原理、实现与示例
  • ctf-show-micsx
  • 【Kubernetes】StorageClass 的作用是什么?如何实现动态存储供应?
  • TLS 1.2 握手过程,每个阶段如何保证通信安全?​​
  • 古诗词数据集(74602条简体版、繁体版) | 智能体知识库 | AI大模型训练