• 代理模式:在 AOP 和 Remoting 中被用的比较多。

  • 单例模式:在 Spring 配置文件中定义的 Bean 默认为单例。

  • 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。

  • 前端控制器:Spring 提供了 DispatcherServlet 来对请求进行分发。

  • 视图帮助(View Helper ):Spring 提供了一系列的 JSP 标签,高效宏来辅助将分散的代码整合在视图里。

  • 依赖注入:贯穿于 BeanFactory / ApplicationContext 接口的核心理念。

  • 工厂模式:BeanFactory 用来创建对象的实例。

七条清单覆盖了高频答案,但每条都停在”点名”层面。面试与源码阅读真正需要的是:每个模式在 Spring 中的具体落点(类名级)与它解决了什么设计问题。本文把清单升级为”模式 → 落点 → 动机”三元组,并补充清单遗漏的几种。

工厂模式:BeanFactory 与 FactoryBean

  • BeanFactory:简单工厂/工厂方法思想的容器化——按名/按类型生产对象,调用方不关心构造细节
  • FactoryBean:更精妙的一层——当对象创建逻辑复杂(代理、连接池、序列化框架对象)时,把”创建算法”本身封装成 bean;getObject() 返回产品,getObjectType 声明类型。MyBatis 的 MapperFactoryBean、Spring 的 ProxyFactoryBean 都是它

动机:把”new 的复杂性”从业务代码移入可管理的组件。

单例模式:容器级单例注册表

  • 落点:DefaultSingletonBeanRegistry 的 singletonObjects(ConcurrentHashMap)+ 三级缓存
  • 与 GoF 单例差异:容器级(beanName 唯一)而非类级;靠注册表约束而非私有构造

动机:共享无状态组件、控制内存与初始化成本。

代理模式:AOP 的物理基础

  • 落点:JDK 动态代理(InvocationHandler)/ CGLIB 子类生成;AbstractAutoProxyCreator 决策
  • 动机:不修改目标类织入横切逻辑;远程调用替身(Remoting stub)

模板方法模式:骨架固定、步骤留空

  • 落点:JdbcTemplate(获取连接/异常翻译/释放由模板做,SQL 与映射留给回调)、AbstractApplicationContext.refresh(十二步骨架,子类钩子 onRefresh/postProcessBeanFactory)、AbstractPlatformTransactionManager(begin/commit 流程固定,doBegin/doCommit 留子类)
  • 动机:流程复用 + 差异点开放——框架扩展性的主手段

适配器模式:调用差异的隔离

  • 落点:HandlerAdapter(不同 Handler 类型统一调用入口)、Spring MVC 的 ViewResolver 适配、JMS 的 MessageConverter
  • 动机:DispatcherServlet 不依赖具体 Handler 形态,新增 Handler 类型只需新增适配器

策略模式:可替换算法族

  • 落点:HandlerMapping 多实现(RequestMapping/BeanName/RouterFunction)、Resource 接口(ClassPath/FileSystem/Url 资源访问策略)、TransactionManager 多实现、拒绝策略(线程池虽非 Spring 但同思想)
  • 动机:同一接口多算法,运行期按配置/上下文选择

观察者模式:事件驱动解耦

  • 落点:ApplicationEvent + ApplicationListener + ApplicationEventPublisher;容器刷新/关闭发布 ContextRefreshedEvent 等
  • 动机:组件间不直接引用,靠事件协作(启动后初始化、缓存清理的常用挂载点)

责任链模式:处理器链

  • 落点:HandlerInterceptor 链、Filter 链、HandlerExceptionResolver 链、AOP 拦截器链(ReflectiveMethodInvocation 递归 proceed)
  • 动机:处理逻辑可插拔排序组合

装饰器/包装模式:Wrapper 与增强

  • 落点:BeanWrapper(属性访问包装)、HttpServletRequestWrapper、TransactionAwareDataSourceProxy(给普通 DataSource 包上事务感知)
  • 动机:不改原类增强能力

建造者模式:复杂对象分步构建

  • 落点:BeanDefinitionBuilder、UriComponentsBuilder、MockMvcBuilder
  • 动机:参数众多的对象用链式分步构造替代巨型构造器

依赖注入:模式还是原则

严格说 DI 是 IoC 的实现手段(构造器/Setter/字段注入),GoF 未收录;但它是 Spring 全部模式的组织原则:上述工厂/单例/策略都因 DI 才能被容器统一装配替换。

记忆框架

按”创建—组织—调用—协作”四组归类:

  • 创建:工厂、单例、建造者
  • 组织:模板方法、策略、装饰器
  • 调用:代理、适配器、责任链
  • 协作:观察者、依赖注入

面试时按组展开而非逐条罗列,能体现体系化理解;源码阅读时认出这些模式,就等于认出了框架作者的扩展点设计意图——Spring 的每个扩展点背后都站着一个设计模式。