Spring 用到了哪些设计模式?¶
结论速查¶
| 设计模式 | 在 Spring 中的应用 |
|---|---|
| 工厂方法 / 简单工厂 | BeanFactory、ApplicationContext |
| 单例 | Bean 默认 singleton 作用域 |
| 代理 | AOP(JDK / CGLIB) |
| 模板方法 | JdbcTemplate、RestTemplate、RedisTemplate |
| 观察者 | ApplicationEvent / ApplicationListener |
| 适配器 | HandlerAdapter、AdvisorAdapter |
| 装饰器 | BeanWrapper、各种 Wrapper |
| 责任链 | Filter、Interceptor、BeanPostProcessor |
| 策略 | Resource 接口、InstantiationStrategy |
| 外观 | ApplicationContext 封装资源访问 |
| 建造者 | BeanDefinitionBuilder、UriComponentsBuilder |
| 迭代器 | Iterator 在集合中的使用 |
重点展开¶
1. 工厂模式¶
Spring 本质是个大工厂:
BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) factory.getBean("user");
BeanFactory 是顶层接口,ApplicationContext 是它的增强版。
2. 单例模式¶
Spring Bean 默认 singleton,但它是容器管理的单例,不是 GoF 那种饿汉/懒汉单例。每个 BeanDefinition 在容器中只有一个共享实例。
3. 代理模式(AOP)¶
4. 模板方法¶
JdbcTemplate 把"获取连接、创建语句、执行、遍历结果、关闭"流程固定,把"SQL、参数、行映射"留给子类:
List<User> users = jdbcTemplate.query(
"SELECT * FROM user WHERE id = ?",
new BeanPropertyRowMapper<>(User.class),
1
);
5. 观察者模式¶
// 事件
public class OrderCreatedEvent extends ApplicationEvent { ... }
// 发布
applicationEventPublisher.publishEvent(new OrderCreatedEvent(this, order));
// 监听
@EventListener
public void onOrderCreated(OrderCreatedEvent event) { ... }
6. 适配器模式¶
HandlerAdapter 把不同类型的 Controller(Controller 接口、@RequestMapping 注解方法、HttpRequestHandler)统一成 handle() 调用。
7. 责任链¶
BeanPostProcessor:在 Bean 初始化前后插入处理。BeanFactoryPostProcessor:在 BeanDefinition 加载后处理。- Spring Security 的 FilterChain。
8. 策略模式¶
Resource 接口有 ClassPathResource、FileSystemResource、UrlResource 等不同实现,根据配置选择。
面试加分
- Spring 用了大量后置处理器(
BeanPostProcessor),这是它扩展点的核心。 - 单例 Bean 的线程安全问题:有状态 Bean(如成员变量)在 singleton 下多线程共享,要小心。