Spring框架運(yùn)用了多種設(shè)計(jì)模式方式
Spring 框架在設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中,廣泛運(yùn)用了多種設(shè)計(jì)模式,這些設(shè)計(jì)模式幫助 Spring 實(shí)現(xiàn)了高內(nèi)聚、低耦合、可擴(kuò)展和易維護(hù)的架構(gòu)。
以下詳細(xì)介紹 Spring 中常用的設(shè)計(jì)模式及其應(yīng)用場(chǎng)景:
1. 工廠模式(Factory Pattern)
作用:封裝對(duì)象創(chuàng)建的邏輯,解耦對(duì)象的創(chuàng)建和使用,讓代碼更靈活、可維護(hù)。
Spring 中的體現(xiàn):
BeanFactory 和 ApplicationContext:
它們是工廠模式的典型實(shí)現(xiàn),負(fù)責(zé)創(chuàng)建和管理 Bean。
BeanFactory是基礎(chǔ)工廠接口,提供最基本的 Bean 創(chuàng)建、查找功能;ApplicationContext是更高級(jí)的工廠(繼承BeanFactory),還支持 AOP、國(guó)際化、事件發(fā)布等功能。- 示例:通過(guò)
applicationContext.getBean("userService")獲取 Bean,無(wú)需關(guān)心UserService如何實(shí)例化(構(gòu)造器、工廠方法等)。
FactoryBean:
- 是一種“工廠 Bean”,允許自定義 Bean 的創(chuàng)建邏輯。
- 比如整合第三方框架(如 MyBatis 的
SqlSessionFactoryBean)時(shí),FactoryBean可以封裝復(fù)雜的創(chuàng)建過(guò)程,讓框架無(wú)縫接入 Spring。
2. 單例模式(Singleton Pattern)
作用:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供全局訪問(wèn)點(diǎn),節(jié)省資源、保證狀態(tài)一致。
Spring 中的體現(xiàn):
默認(rèn) Bean 作用域(singleton):
Spring 容器中,默認(rèn)情況下每個(gè) Bean 的作用域是單例(除非顯式配置 prototype 或其他作用域)。
- 實(shí)現(xiàn):通過(guò)
DefaultSingletonBeanRegistry維護(hù)一個(gè)單例緩存(singletonObjects),確保 Bean 全局唯一。 - 示例:
@Service標(biāo)注的服務(wù)類(lèi),整個(gè)應(yīng)用中只有一個(gè)實(shí)例,避免重復(fù)創(chuàng)建開(kāi)銷(xiāo)。
3. 代理模式(Proxy Pattern)
作用:通過(guò)代理對(duì)象增強(qiáng)目標(biāo)對(duì)象的功能(如權(quán)限控制、日志、事務(wù)),且不修改目標(biāo)對(duì)象代碼。
Spring 中的體現(xiàn):
AOP 實(shí)現(xiàn):
Spring AOP 基于動(dòng)態(tài)代理,有兩種方式:
- JDK 動(dòng)態(tài)代理:針對(duì)實(shí)現(xiàn)接口的類(lèi),通過(guò)
java.lang.reflect.Proxy創(chuàng)建代理對(duì)象,增強(qiáng)接口方法。 - CGLIB 動(dòng)態(tài)代理:針對(duì)未實(shí)現(xiàn)接口的類(lèi),通過(guò)繼承目標(biāo)類(lèi)創(chuàng)建代理對(duì)象(重寫(xiě)方法實(shí)現(xiàn)增強(qiáng))。
示例:@Transactional 注解的事務(wù)管理,就是通過(guò)代理對(duì)象在方法調(diào)用前后織入事務(wù)邏輯。
4. 模板方法模式(Template Method Pattern)
作用:定義算法的骨架,將可變部分延遲到子類(lèi)實(shí)現(xiàn),減少重復(fù)代碼。
Spring 中的體現(xiàn):
- 數(shù)據(jù)庫(kù)操作模板(
JdbcTemplate、RedisTemplate等): - 以
JdbcTemplate為例,它封裝了 JDBC 的固定流程(獲取連接、創(chuàng)建語(yǔ)句、執(zhí)行 SQL、關(guān)閉資源),而 SQL 執(zhí)行邏輯(可變部分)由開(kāi)發(fā)者通過(guò)回調(diào)(RowMapper)實(shí)現(xiàn)。
示例:
List<User> users = jdbcTemplate.query("SELECT * FROM user", new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
// 映射結(jié)果集到 User 對(duì)象(自定義邏輯)
return new User(rs.getLong("id"), rs.getString("name"));
}
});
5. 觀察者模式(Observer Pattern)
作用:定義對(duì)象間的一對(duì)多依賴,當(dāng)一個(gè)對(duì)象狀態(tài)變化時(shí),通知所有依賴對(duì)象自動(dòng)更新。
Spring 中的體現(xiàn):
事件驅(qū)動(dòng)模型(ApplicationEvent 和 ApplicationListener):
- 發(fā)布者通過(guò)
ApplicationEventPublisher發(fā)布事件(如ContextRefreshedEvent表示容器初始化完成); - 監(jiān)聽(tīng)者實(shí)現(xiàn)
ApplicationListener接口,訂閱感興趣的事件,事件發(fā)生時(shí)觸發(fā)onApplicationEvent方法。
示例:
// 自定義事件
public class UserRegisteredEvent extends ApplicationEvent {
public UserRegisteredEvent(User user) {
super(user);
}
}
// 監(jiān)聽(tīng)者
@Component
public class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> {
@Override
public void onApplicationEvent(UserRegisteredEvent event) {
User user = (User) event.getSource();
// 發(fā)送注冊(cè)通知(如郵件、短信)
}
}
// 發(fā)布事件
@Service
public class UserService {
@Autowired private ApplicationEventPublisher publisher;
public void register(User user) {
// 注冊(cè)邏輯...
publisher.publishEvent(new UserRegisteredEvent(user));
}
}
6. 適配器模式(Adapter Pattern)
作用:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶端期望的另一種接口,使原本不兼容的類(lèi)可以協(xié)作。
Spring 中的體現(xiàn):
HandlerAdapter(Spring MVC 中):
DispatcherServlet 需要調(diào)用不同類(lèi)型的 Controller(如注解驅(qū)動(dòng)的 @Controller、古老的 Controller 接口),HandlerAdapter 作為適配器,統(tǒng)一調(diào)用方式。
示例:
SimpleControllerHandlerAdapter適配實(shí)現(xiàn)Controller接口的類(lèi);RequestMappingHandlerAdapter適配@Controller+@RequestMapping注解的類(lèi)。- 這樣
DispatcherServlet只需調(diào)用handlerAdapter.handle(...),無(wú)需關(guān)心具體 Controller 類(lèi)型。
7. 裝飾者模式(Decorator Pattern)
作用:動(dòng)態(tài)地給對(duì)象添加額外職責(zé),比繼承更靈活(避免子類(lèi)爆炸)。
Spring 中的體現(xiàn):
BeanWrapper 對(duì) Bean 的增強(qiáng):
BeanWrapper封裝了 Bean 對(duì)象,并提供類(lèi)型轉(zhuǎn)換、屬性訪問(wèn)等增強(qiáng)功能。- 比如在屬性注入時(shí),
BeanWrapper會(huì)自動(dòng)將配置文件中的字符串轉(zhuǎn)換為 Bean 的屬性類(lèi)型(如把"18"轉(zhuǎn)為Integer)。
HttpServletRequestWrapper(Spring Web 中):
- 用于包裝
HttpServletRequest,動(dòng)態(tài)添加功能(如修改請(qǐng)求參數(shù)、頭信息)。
8. 策略模式(Strategy Pattern)
作用:定義一系列算法,將每個(gè)算法封裝成策略類(lèi),運(yùn)行時(shí)動(dòng)態(tài)選擇策略。
Spring 中的體現(xiàn):
資源加載策略(ResourceLoader):
Spring 支持多種資源加載方式(如類(lèi)路徑、文件系統(tǒng)、URL),ResourceLoader 通過(guò) Resource 接口的不同實(shí)現(xiàn)(ClassPathResource、FileSystemResource 等),動(dòng)態(tài)選擇加載策略。
示例:
Resource resource = resourceLoader.getResource("classpath:config.properties");
// 根據(jù)路徑前綴(classpath:、file: 等)自動(dòng)選擇策略加載資源
總結(jié):Spring 設(shè)計(jì)模式的價(jià)值
這些設(shè)計(jì)模式不是孤立的,而是相互配合,共同支撐 Spring 的核心特性(如 IoC、AOP、MVC):
- 解耦與靈活:工廠模式、代理模式、適配器模式讓組件可插拔、易擴(kuò)展;
- 高效與簡(jiǎn)潔:模板方法模式、單例模式減少重復(fù)代碼,提升性能;
- 可維護(hù)與可擴(kuò)展:觀察者模式、策略模式讓框架具備高內(nèi)聚、低耦合的架構(gòu)。
理解這些設(shè)計(jì)模式,不僅能更好地使用 Spring,還能學(xué)習(xí)框架設(shè)計(jì)的思路,應(yīng)用到自己的代碼中。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合DeepSeek技術(shù)指南(實(shí)際應(yīng)用場(chǎng)景)
這篇文章主要介紹了SpringBoot整合DeepSeek技術(shù)指南,本文通過(guò)實(shí)際應(yīng)用場(chǎng)景模擬給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04
java中關(guān)于內(nèi)部類(lèi)的使用詳解
本篇文章介紹了,在java中關(guān)于內(nèi)部類(lèi)的使用詳解。需要的朋友 參考下2013-04-04
淺談Spring Data如何簡(jiǎn)化數(shù)據(jù)操作的方法
這篇文章主要介紹了看Spring Data如何簡(jiǎn)化數(shù)據(jù)操作的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
Java getParameter()獲取數(shù)據(jù)為空的問(wèn)題
這篇文章主要介紹了Java getParameter()獲取數(shù)據(jù)為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
聊聊SpringCloud中的Ribbon進(jìn)行服務(wù)調(diào)用的問(wèn)題
SpringCloud-Ribbon是基于Netflix?Ribbon實(shí)現(xiàn)的一套客戶端負(fù)載均衡的工具。本文給大家介紹SpringCloud中的Ribbon進(jìn)行服務(wù)調(diào)用的問(wèn)題,感興趣的朋友跟隨小編一起看看吧2022-01-01
Java校驗(yàn)validate介紹和使用實(shí)例
這篇文章主要介紹了Java校驗(yàn)validate介紹和使用的相關(guān)資料,還介紹了如何使用@Valid和@Validated注解進(jìn)行聲明式校驗(yàn),以及如何處理復(fù)雜校驗(yàn)需求,通過(guò)自定義校驗(yàn)注解來(lái)實(shí)現(xiàn),需要的朋友可以參考下2025-01-01
Java?數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹(shù)題集下
二叉樹(shù)可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過(guò)實(shí)際題目來(lái)熟練掌握2022-04-04

