高 进阶
Spring设计模式应用#
一句话答案#
Spring 大量使用设计模式:工厂(BeanFactory)、单例(Bean 默认)、代理(AOP)、模板方法(JdbcTemplate)、观察者(事件)。
核心要点
Spring 中常见的设计模式:
| 模式 | Spring 中的应用 | 说明 |
|---|---|---|
| 工厂模式 | BeanFactory / ApplicationContext | IoC 容器本身就是工厂,负责创建和管理 Bean |
| 单例模式 | Bean 默认 scope=singleton | 三级缓存解决循环依赖下的单例保证 |
| 代理模式 | AOP(JDK 动态代理 / CGLIB) | @Transactional、@Cacheable、@Async 背后都是代理 |
| 模板方法模式 | JdbcTemplate / RestTemplate / RedisTemplate | 固定样板流程封装在模板中,可变部分通过回调暴露 |
| 观察者模式 | ApplicationEvent + ApplicationListener | 发布-订阅解耦,如 ContextRefreshedEvent |
| 策略模式 | HandlerMapping / Resource 接口 | DispatcherServlet 按策略选择 Handler |
| 适配器模式 | HandlerAdapter | 让不同类型的 Handler 统一处理 |
| 责任链模式 | Filter / HandlerInterceptor | Servlet 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 中的应用