Skip to content

你了解的 Spring 都用到哪些设计模式? ​

  • 标签:后端、Spring

🏛 业务架构师 ​

Spring 是设计模式的教科书,我按框架用它承载什么扩展点来讲——这样记才有业务意义:

  • 工厂模式:BeanFactory/ApplicationContext 本体。对象的创建权从业务代码手里收走,统一装配,这是整个生态的地基;
  • 单例模式:bean 默认作用域。配出的无状态服务可被所有请求共享——省内存、省创建开销,代价是业务 bean 必须无状态,这是我评审代码时盯"Service 里能不能有成员变量"的依据;
  • 代理模式:AOP 的实现(JDK 动态代理 / CGLIB)。事务、缓存、异步 @Async 全靠它,业务代码因此只写业务;
  • 模板方法:JdbcTemplate、RedisTemplate、RestTemplate。把"获取连接 → 操作 → 释放资源"的固定骨架框死,业务只填 SQL 和回调——资源泄漏这类低级但致命的错误被结构性消除;
  • 观察者模式:ApplicationEvent 体系,业务事件解耦的标准件;
  • 策略模式:Resource 加载、实例化策略、Security 的编码器选择;
  • 责任链:MVC 的 HandlerInterceptor、Security 的 FilterChain;
  • 适配器:HandlerAdapter 适配不同类型的控制器方法。

架构视角的总结:框架 = 用模式固化的扩展点集合。业务做定制时,先找框架预留的扩展点(PostProcessor、Listener、Interceptor),而不是绕开框架自己造——顺着扩展点做定制是资产,hack 框架内部是负债。这也是我判断团队 Spring 熟练度的标尺。

🏗 系统架构师 ​

Spring 框架自身就是设计模式的教科书,我按模块对应:

  • 工厂模式:BeanFactory 体系,对象的创建与使用分离;
  • 单例模式:Bean 默认 scope=singleton,容器级单例(非 JVM 级,是 Map 缓存实现);
  • 代理模式:AOP 的 JDK/CGLIB 动态代理,事务、缓存、异步注解都靠它织入;
  • 模板方法:JdbcTemplate、RedisTemplate、RestTemplate,流程骨架固定、回调暴露变化点;AbstractApplicationContext.refresh 也是;
  • 观察者模式:ApplicationEvent + ApplicationListener,容器刷新完成、关闭都有事件发布;
  • 策略模式:Resource 加载(ClassPath/File/URL)、AopProxyFactory 选择代理方式、InstantiationStrategy;
  • 责任链模式:HandlerInterceptor、Servlet Filter、MVC 的 DispatcherServlet 处理流程;
  • 适配器模式:HandlerAdapter 适配不同类型的 Controller(注解/传统);Spring MVC 异常处理的 HandlerExceptionResolver;
  • 装饰器模式:BeanWrapper;Java IO 体系同款思想;
  • 建造者模式:BeanDefinitionBuilder、OkHttp/Feign 的配置构建。

答这题的加分点在于"模式 + 框架承担的架构职责"一起讲:Spring 用这些模式达成的是解耦(IOC 管理依赖)、扩展(PostProcessor 开放点)、非功能注入(AOP)三件事。

💻 全栈开发专家 ​

Spring 源码里设计模式密度极高,我对得出场景的这些:

  • 工厂模式:BeanFactory 体系(getBean 按类型/名字取对象),FactoryBean 定制复杂对象创建(MyBatis 的 SqlSessionFactoryBean、OpenFeign 的 FeignClientFactoryBean)。
  • 单例模式:Bean 默认 scope=singleton,由容器三级缓存保证(不是饿汉/懒汉那种类加载锁实现)。
  • 代理模式:AOP,JdkDynamicAopProxy / CGLIB ObjenesisCglibAopProxy。
  • 模板方法:JdbcTemplate、RedisTemplate、AbstractApplicationContext.refresh() 整个启动流程。
  • 观察者模式:ApplicationEvent + ApplicationListener,容器事件(ContextRefreshedEvent)和业务事件。
  • 策略模式:Resource 加载(ClassPathResource/FileSystemResource...)、InstantiationStrategy 实例化策略。
  • 责任链模式:HandlerInterceptor 链、AOP 的 MethodInterceptor 链(事务、缓存就是链上一环)。
  • 适配器模式:HandlerAdapter 让 DispatcherServlet 统一调用各类 Controller;spring-boot 2.7 → 3.0 的适配层。
  • 装饰器模式:BufferingHttpRequest... 最典型是 BeanWrapper 对象包装。

面试话术技巧:别只报名字,点一个源码位置(如"FactoryBean 的 getObject 在 getBean 流程里会被检查"),马上和其他背书的人拉开差距。最后补一句:Spring 的设计模式都服务于"解耦和扩展点",这也是它作为框架能被生态扩展的根本。