🧠 一、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 模式
@Component
public class UserService {}
Spring 默認所有 Bean 都是單例,容器只創建一次,整個項目中共用同一實例。
2?? 工廠模式 & 抽象工廠模式
BeanFactory
是頂層工廠ApplicationContext
是功能更強大的“抽象工廠”FactoryBean
是 Spring 中的一種特殊 Bean
@Component
public class MyFactoryBean implements FactoryBean<MyBean> {public MyBean getObject() {return new MyBean(); // 自定義創建邏輯}
}
3?? 代理模式:AOP 的核心
使用 JDK 動態代理或 CGLIB 生成目標類的代理對象,增強原方法邏輯。
@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 就是經典代表
jdbcTemplate.query("SELECT * FROM users", rs -> {// 回調方法就是自定義部分
});
固定的執行流程(打開連接 → 執行 → 關閉),回調中只關注“變化點”。
5?? 觀察者模式:Spring 事件機制
applicationContext.publishEvent(new MyCustomEvent(...));
所有
ApplicationListener
都會接收到事件回調,實現異步解耦。
6?? 責任鏈模式:攔截器鏈、Filter 鏈
Spring MVC 中的 HandlerInterceptor 實現鏈式執行:
preHandle() → Controller → postHandle() → afterCompletion()
📦 三、為什么 Spring 用這么多設計模式?
- 解耦:控制反轉、代理、事件等機制讓組件之間低耦合
- 復用性強:模板方法、策略等讓開發者只寫差異部分
- 擴展性好:BeanPostProcessor、HandlerMapping 都可拓展
- 代碼清晰:職責分明、結構層次清楚
? 總結一句話:
Spring 是一個把面向對象設計模式發揮到極致的框架。掌握設計模式,等于讀懂 Spring 背后的智慧。