Spring 框架中用到了哪些设计模式
代理模式:在 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 的每个扩展点背后都站着一个设计模式。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 非鱼小站!
评论
WalineDisqus











