Spring核心设计模式

Spring 框架之所以成为 Java 生态事实标准,核心并非单纯封装 API,而是通过合理、克制、精准的设计模式解决了原生 Java 开发的各类工程痛点。

一、单例模式(Singleton)

1. Spring 落地场景

Spring IOC 容器中 默认 Bean 作用域为单例(singleton)。整个容器中同一个 Bean 仅实例化一次,全局复用单例对象。

注意:Spring 并非使用原生饿汉/懒汉单例,而是容器级可控单例,由 IOC 统一管理创建、销毁、依赖注入。

2. 为什么需要该模式

原生开发中,业务 Bean、工具类反复 new 对象,会造成大量内存对象冗余、频繁 GC、资源浪费。

无单例管控时,每层业务都自主 new 对象,对象不可控、无法统一初始化、无法统一销毁。

3. 使用后的核心优点

  • 极致节省内存:全局唯一实例,避免重复创建大量无用对象,降低内存占用与 GC 压力。

  • 统一资源管控:容器统一初始化、依赖注入、销毁回调,对象生命周期完全可控。

  • 提升系统性能:无需反复执行构造方法、初始化逻辑,大幅提升接口响应速度。

4. 工程取舍与避坑

单例 Bean 非线程安全,禁止在 Bean 中定义成员变量存储业务状态,避免并发脏数据。有状态场景必须使用 prototype 多例。

二、工厂模式(Factory)

1. Spring 落地场景

Spring 核心两大工厂:BeanFactoryApplicationContext

所有 Bean 对象不通过开发者 new 创建,全部由工厂统一生产、组装、管理。同时 Spring 各类资源、解析器、策略类均由工厂统一获取。

2. 为什么需要该模式

传统开发 硬编码 new 对象,对象创建与业务代码强耦合。

如果业务层直接 new Dao、new Service,后续替换实现类、修改初始化逻辑需要改动所有业务代码,扩展性极差。

3. 使用后的核心优点

  • 彻底解耦创建与使用:业务层只负责调用,不负责对象创建,符合单一职责。

  • 统一生产规范:所有 Bean 统一经过实例化、属性填充、初始化、后置处理,流程标准化。

  • 极高扩展性:替换底层实现无需改业务代码,只改容器配置。

三、单例工厂配套:注册器模式(Registry)

1. Spring 落地场景

BeanDefinitionRegistry、Bean 注册表、处理器注册表、拦截器注册表。

Spring 启动时扫描所有 Bean,统一注册到注册表,工厂根据注册表信息实例化对象。

2. 为什么需要该模式

工厂需要「生产依据」,如果没有注册表,工厂无法知道需要创建哪些 Bean、Bean 的属性与依赖是什么。

3. 核心优点

实现 配置与生产分离,先批量注册定义,再统一实例化,支撑 Spring 全自动 IOC 能力。

四、代理模式(Proxy)

1. Spring 落地场景

AOP 核心底层、事务注解 @Transactional、权限拦截、日志切面、缓存切面全部基于动态代理实现。

Spring 自动适配:有接口用 JDK 动态代理,无接口用 CGLIB 代理。

2. 为什么需要该模式

原生开发中,日志、事务、权限、监控属于通用横切逻辑

如果直接写在业务方法内,会导致业务代码充斥非业务冗余逻辑,代码臃肿、无法复用、修改成本极高。

3. 使用后的核心优点

  • 业务与非业务逻辑解耦:核心业务只写业务逻辑,事务、日志、监控全部抽离切面。

  • 无侵入增强:不修改目标方法源码,即可对方法做功能增强,符合开闭原则。

  • 统一管控:所有横切逻辑统一收口,统一规则、统一维护、统一迭代。

五、装饰器模式(Decorator)

1. Spring 落地场景

BeanPostProcessor、BeanFactoryPostProcessor、各类后置增强处理器。

Spring 创建完原生 Bean 后,通过多层后置处理器对 Bean 层层装饰、增强、修改属性、生成代理对象。

2. 为什么需要该模式

Bean 原生创建逻辑固定,无法灵活扩展。如果新增功能就要改创建源码,框架完全无法迭代。

装饰器模式允许 在不修改原有代码的前提下,层层叠加增强能力

3. 核心优点

  • 多层增强互不干扰,可单独开启、关闭、替换处理器。

  • 支撑 Spring 极高的扩展性,各类中间件、插件均通过后置处理器扩展。

  • 遵循开闭原则,原生代码稳定不变,能力无限扩展。

六、适配器模式(Adapter)

1. Spring 落地场景

HandlerAdapter 处理器适配器、各种类型参数解析器、返回值处理器。

Spring MVC 中 Controller 方法参数、返回值类型五花八门,通过适配器统一适配、统一调用。

2. 为什么需要该模式

如果没有适配器,DispatcherServlet 需要写无数 if/else 判断不同方法类型,代码极度臃肿、无法扩展。

3. 核心优点

  • 统一调用入口,适配多种异构接口。

  • 新增方法类型、参数类型无需改动核心源码,只新增适配器。

  • 彻底消除臃肿分支判断代码。

七、策略模式(Strategy)

1. Spring 落地场景

资源加载策略、类型转换策略、代理策略、解析策略、校验策略。

典型场景:根据不同环境、不同类型自动选用不同执行策略。比如:有接口用 JDK 代理、无接口用 CGLIB 代理。

2. 为什么需要该模式

多分支业务如果用 if/else 硬编码,逻辑混乱、新增策略需要改核心代码、可读性极差。

3. 核心优点

  • 分支逻辑独立封装,每种策略单独一个类。

  • 策略可自由切换、可动态替换。

  • 彻底消灭 if/else,代码整洁易维护。

八、模板方法模式(Template Method)

1. Spring 落地场景

Spring 大量模板类:JdbcTemplate、RedisTemplate、TransactionTemplate

父类固定整体执行流程、事务流程、资源开关流程,开放抽象方法给子类自定义实现。

2. 为什么需要该模式

数据库连接、关闭、事务开启、提交、回滚、资源释放是固定通用流程

如果每个开发者自己写连接、关闭、事务,极易出现资源泄漏、事务不规范、重复代码泛滥。

3. 核心优点

  • 固定骨架,开放扩展:通用流程框架统一管控,业务只需关注自定义逻辑。

  • 杜绝资源泄漏、事务错乱,统一编码规范。

  • 极大减少重复模板代码,开发效率翻倍。

九、观察者模式(Observer)

1. Spring 落地场景

Spring 事件机制:ApplicationEvent、ApplicationListener、事件发布与监听。

容器刷新完成事件、Bean 加载完成事件、自定义业务事件全部基于观察者模式。

2. 为什么需要该模式

业务之间存在大量联动操作,如果采用硬编码调用,业务强耦合、改动一处牵连多处。

例如:用户注册成功后发积分、发短信、发日志,硬编码会导致注册方法极度臃肿。

3. 核心优点

  • 发布订阅解耦:发布方只管发布事件,无需关心谁监听、如何处理。

  • 新增业务联动无需改原有代码,新增监听类即可。

  • 业务联动清晰、可扩展、可降级。

十、Spring 设计模式全局总结

Spring 所有设计模式的核心目的只有三件事:解耦、统一管控、高可扩展

  • 工厂 + 单例 + 注册器:解决对象创建混乱、资源浪费问题,实现 IOC 容器核心能力。

  • 代理 + 装饰器:解决通用横切逻辑冗余问题,实现 AOP 无侵入增强。

  • 适配器 + 策略:解决多类型适配、多分支臃肿问题,提升框架兼容性。

  • 模板方法:解决通用流程不统一、资源泄漏问题,标准化开发范式。

  • 观察者:解决业务联动耦合问题,实现事件驱动、业务解耦。

相关推荐
Java小白笔记1 小时前
Java 实现阿里云 OSS 文件上传链路:普通上传、秒传、分片与断点续传
java·开发语言·数据库·spring·阿里云
2333!!!!!1 小时前
rocket新手一些常见问题
java·开发语言
骇客野人1 小时前
Springboot 的 配置文件 application.yml 和 bootrap.yml 的由来和作用
java·spring boot·后端
wuminyu1 小时前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
CoderYanger1 小时前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯
吴声子夜歌1 小时前
ApacheCommons——commons-lang3(Java 基础语言增强)(二)
java·开发语言·apache
xcl09251 小时前
幼儿托管系统开发实战:从需求分析到部署上线全指南
java·spring boot·需求分析
我不会起名字3221 小时前
一天一道算法题(26):栈的简单应用
java·数据结构·python·算法·leetcode·golang·
凯尔萨厮2 小时前
Java学习笔记十五(GUI)
java·笔记·学习