🧠 一、Spring 中常见的设计模式
设计模式 | 类型 | Spring 中的应用场景 |
---|---|---|
单例模式 | 创建型 | 默认 Bean 是单例的 |
工厂模式 | 创建型 | BeanFactory 、FactoryBean |
抽象工厂模式 | 创建型 | ApplicationContext 提供多个工厂接口 |
代理模式 | 结构型 | AOP 动态代理(JDK/CGLIB) |
模板方法模式 | 行为型 | JdbcTemplate 、TransactionTemplate |
观察者模式 | 行为型 | ApplicationEventPublisher 、事件监听 |
策略模式 | 行为型 | Bean 的多实现组合(如多种验证器) |
适配器模式 | 结构型 | HandlerAdapter 、ViewResolver |
装饰器模式 | 结构型 | BeanPostProcessor、Filter 链式处理 |
责任链模式 | 行为型 | Spring MVC 的拦截器链、Filter 链 |
原型模式 | 创建型 | @Scope("prototype") Bean 每次创建新实例 |
建造者模式 | 创建型 | BeanDefinitionBuilder 构建 Bean 配置 |
组合模式 | 结构型 | BeanFactory 管理多个 Bean、容器组合结构 |
🚀 二、常见设计模式详解举例
1️⃣ 单例模式:默认 Bean 模式
java
@Component
public class UserService {}
Spring 默认所有 Bean 都是单例,容器只创建一次,整个项目中共用同一实例。
2️⃣ 工厂模式 & 抽象工厂模式
BeanFactory
是顶层工厂ApplicationContext
是功能更强大的"抽象工厂"FactoryBean
是 Spring 中的一种特殊 Bean
java
@Component
public class MyFactoryBean implements FactoryBean<MyBean> {
public MyBean getObject() {
return new MyBean(); // 自定义创建逻辑
}
}
3️⃣ 代理模式:AOP 的核心
使用 JDK 动态代理或 CGLIB 生成目标类的代理对象,增强原方法逻辑。
java
@Around("execution(* com.example..*Service.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("方法执行前");
Object result = joinPoint.proceed();
System.out.println("方法执行后");
return result;
}
4️⃣ 模板方法模式:JdbcTemplate 就是经典代表
java
jdbcTemplate.query("SELECT * FROM users", rs -> {
// 回调方法就是自定义部分
});
固定的执行流程(打开连接 → 执行 → 关闭),回调中只关注"变化点"。
5️⃣ 观察者模式:Spring 事件机制
java
applicationContext.publishEvent(new MyCustomEvent(...));
所有
ApplicationListener
都会接收到事件回调,实现异步解耦。
6️⃣ 责任链模式:拦截器链、Filter 链
Spring MVC 中的 HandlerInterceptor 实现链式执行:
java
preHandle() → Controller → postHandle() → afterCompletion()
📦 三、为什么 Spring 用这么多设计模式?
- 解耦:控制反转、代理、事件等机制让组件之间低耦合
- 复用性强:模板方法、策略等让开发者只写差异部分
- 扩展性好:BeanPostProcessor、HandlerMapping 都可拓展
- 代码清晰:职责分明、结构层次清楚
✅ 总结一句话:
Spring 是一个把面向对象设计模式发挥到极致的框架。掌握设计模式,等于读懂 Spring 背后的智慧。