面试知识库
进阶

Spring设计模式应用#

一句话答案#

Spring 大量使用设计模式:工厂(BeanFactory)、单例(Bean 默认)、代理(AOP)、模板方法(JdbcTemplate)、观察者(事件)。

核心要点

Spring 中常见的设计模式:

模式Spring 中的应用说明
工厂模式BeanFactory / ApplicationContextIoC 容器本身就是工厂,负责创建和管理 Bean
单例模式Bean 默认 scope=singleton三级缓存解决循环依赖下的单例保证
代理模式AOP(JDK 动态代理 / CGLIB)@Transactional、@Cacheable、@Async 背后都是代理
模板方法模式JdbcTemplate / RestTemplate / RedisTemplate固定样板流程封装在模板中,可变部分通过回调暴露
观察者模式ApplicationEvent + ApplicationListener发布-订阅解耦,如 ContextRefreshedEvent
策略模式HandlerMapping / Resource 接口DispatcherServlet 按策略选择 Handler
适配器模式HandlerAdapter让不同类型的 Handler 统一处理
责任链模式Filter / HandlerInterceptorServlet Filter 链、Gateway Filter 链

关键源码入口:

  • 工厂:DefaultListableBeanFactory.getBean()
  • 单例:DefaultSingletonBeanRegistry.getSingleton()
  • 代理:AbstractAutoProxyCreator.postProcessAfterInitialization()
  • 观察者:ApplicationEventMulticaster.multicastEvent()
面试回答(2分钟版)

Spring 框架大量运用了经典设计模式。首先是工厂模式,BeanFactory 和 ApplicationContext 就是工厂,负责创建和管理 Bean 实例。其次是单例模式,Spring Bean 默认作用域是 singleton,容器中只存在一个实例,通过三级缓存解决循环依赖。代理模式是 AOP 的核心,Spring 通过 JDK 动态代理或 CGLIB 生成代理对象来织入切面逻辑。模板方法模式体现在 JdbcTemplate、RestTemplate 等,把固定的样板代码封装在父类中,把可变部分留给回调函数。观察者模式对应 Spring 的事件机制,ApplicationEvent 和 ApplicationListener 实现了发布-订阅的解耦。此外 DispatcherServlet 中使用策略模式通过 HandlerMapping 选择不同的处理器,HandlerAdapter 则是适配器模式的典型应用。面试中能说出五六个并结合源码说明具体用在哪里,会比只列名字加分很多。

追问与易错

追问方向:

  • “观察者模式怎么用?”→ 自定义 ApplicationEvent 事件类,发布者注入 ApplicationEventPublisher 调用 publishEvent(),监听者实现 ApplicationListener 或用 @EventListener 注解方法,实现业务解耦
  • “JdbcTemplate 是什么模式?”→ 模板方法模式,将获取连接、创建 Statement、关闭资源等固定流程封装在模板中,可变的 SQL 执行和结果映射通过回调(RowMapper/PreparedStatementCallback)暴露给使用者
  • “DispatcherServlet 用了什么模式?”→ 前端控制器模式(统一入口)+ 策略模式(通过 HandlerMapping 选择不同的 Handler)+ 适配器模式(HandlerAdapter 适配不同类型的 Handler 统一调用)

易错点:

  • ❌ 只知道模式名不知道具体在哪用
  • ❌ 混淆代理和装饰器在 Spring 中的应用