← 每日面试题 学习看板

Spring中用到了哪些设计模式

面试题/00java/04 框架/01Spring/08扩展与最佳实践/Spring中用到了哪些设计模式.md

面试记录 2026-10-27(Round 29)

题目:Spring 中用到了哪些设计模式?

难度:difficulty/high

评分:⭐⭐⭐☆☆(3/5)

我的回答

Spring 中使用设计模式主要有:单例模式(对象管理)、工厂模式(创建对象)、创建者模式、模板模式(RestTemplate、RedisTemplate、JdbcTemplate 等)、策略模式、代理模式(AOP)、责任链模式、观察者模式。

点评

优点:列举 8 个模式较全(单例/工厂/模板/策略/代理/责任链/观察者)。

不足:"创建者"不准确(Spring 主要是工厂方法 + 建造者,如 BeanDefinitionBuilder);缺每个模式的具体类。

补充:单例=默认 scope;代理=JDK 动态代理/CGLIB;模板=JdbcTemplate/RestTemplate;观察者=ApplicationEvent/Listener。


完整讲解(权威版)

最后更新:2026-10-27 · 基于第 1 次作答

L1 · 30 秒速记

结论:Spring 常考单例/工厂/代理/模板/观察者/责任链/策略,每个要能对应具体实现类。 关键词:单例默认 scope · AOP 代理 · JdbcTemplate 模板 边界:别背清单,要能说"模式解决什么、Spring 哪里用"。

L2 · 核心讲解

核心考点定位:考察设计模式与 Spring 组件的对应,是否理解模式解决什么问题。面试官想排除"报一堆名字但说不出具体类"的空泛回答。

机制链(≥3 环):

  1. 请求进入 → BeanFactory 创建单例:为什么——单例模式,默认 scope 容器缓存,避免反复实例化
  2. AOP 增强 → JDK 动态代理/CGLIB 代理:为什么——代理模式,拦截方法做增强,解耦横切
  3. 模板执行 → JdbcTemplate 固定流程:为什么——模板方法,流程骨架固定,子类/回调定制细节
  4. 事件发布 → ApplicationListener 响应:为什么——观察者模式,解耦发布与订阅
  5. 请求拦截 → HandlerInterceptor 链:为什么——责任链,多级拦截按序处理,可中断

证据锚点(≥12):

对比与权衡:

模式Spring 体现解决的问题适用
单例默认 scope对象复用无状态服务
代理AOP(JDK/CGLIB)横切解耦事务/日志/鉴权
模板方法JdbcTemplate固定流程+细节定制资源访问
观察者ApplicationEvent事件解耦业务事件
责任链Interceptor/Filter请求多级处理Web 过滤链
工厂BeanFactory/FactoryBean对象创建解耦IoC 容器

常见误区:

  1. 错误:Spring 用"创建者模式" → 正确:主要是工厂方法 + 建造者(BeanDefinitionBuilder)→ 为什么:Spring 的 Bean 创建是工厂,Builder 是构建 BeanDefinition
  2. 错误:AOP 默认 JDK 代理 → 正确:Spring Boot 2+ 默认 CGLIB → 为什么:CGLIB 不依赖接口,类也可代理
  3. 错误:单例是硬编码 → 正确:scope=singleton 容器管理 → 为什么:线程安全靠无状态,不是加锁
  4. 错误:观察者一定异步 → 正确:默认同步,@Async 才异步 → 为什么:Spring 事件默认同步发布
  5. 错误:模板方法只是封装调用 → 正确:是流程骨架 + 回调定制 → 为什么:JdbcTemplate 固定连接/事务/释放流程,只有 SQL 和 RowMapper 是回调
  6. 错误:@Transactional 靠自调用生效 → 正确:外部调用才走代理 → 为什么:自调用不经过代理,AOP 失效(同类 this 调用)

适用边界:设计模式在 Spring 是恰当时机恰当使用;单例要求 Bean 无状态;事件监听若处理慢会阻塞发布方,需异步;模板方法不适用于流程需要大改的场景。代理模式对自调用(同类 this 调用)失效,需要暴露代理或拆分方法。

延伸追问(≥3)

  1. AOP 为什么默认 CGLIB?
  1. Spring 事件是同步还是异步?
  1. 单例怎么保证的?
  1. 责任链和 AOP 都能做日志,区别?

面试者参考回答(500–800 字)

【结论】 面试官您好,Spring 是设计模式的应用典范,我按创建/结构/行为三类挑核心来讲,每个都对应具体类。

【三点】 第一,创建型——单例:默认 scope=singleton,DefaultSingletonBeanRegistry 缓存;工厂:BeanFactory/FactoryBean;建造者:BeanDefinitionBuilder。第二,结构型——代理:AOP 用 JDK 动态代理(接口)或 CGLIB(类),Spring Boot 2+ 默认 CGLIB。第三,行为型——模板:JdbcTemplate/RestTemplate/RedisTemplate 固定流程骨架;观察者:ApplicationEvent + ApplicationListener(默认同步,@Async 可异步);责任链:HandlerInterceptor/Filter 链;策略:Resource 接口多实现。

【边界】 当然,设计模式不是越多越好,Spring 在恰当时机用恰当模式,别背清单,要能说清"这个模式解决什么问题、Spring 哪里用了";单例要求 Bean 无状态,事件监听别拖慢发布方。


作答历史

#日期评分本轮主要问题记录
12026-10-273/5"创建者"不准,缺模式对应类第 1 次