Spring涉及的設計模式以及實際使用場景(含代碼)

Spring涉及的設計模式以及實際使用場景(含代碼)

1.工廠模式(Factory Pattern)

作用: 隱藏對象創建的細節,通過工廠類統一管理對象的實例化。

場景:Spring的BeanFactory和ApplicationContext是工廠模式的典型實現。

// 通過ApplicationContext獲取Bean
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);// 自定義 FactoryBean
public class MyFactoryBean implements FactoryBean<MyObject> {@Overridepublic MyObject getObject() throws Exception {return new MyObject(); // 復雜對象的創建邏輯}@Overridepublic Class<?> getObjectType() {return MyObject.class;}
}

2.單例模式(Singleton Pattern)

作用:確保一個類只有一個實例,并提供全局訪問點。

場景:Spring默認的Bean的作用域為單例。

@Service // 默認 singleton
public class OrderService {// ...
}// 測試單例
OrderService bean1 = context.getBean(OrderService.class);
OrderService bean2 = context.getBean(OrderService.class);
System.out.println(bean1 == bean2); // 輸出 true

3.代理模式(Proxy Pattern)

作用:通過代理對象控制對目標對象的訪問,用于增強功能(AOP)

場景:Spring AOP通過動態代理實現日志,事務等功能。

@Aspect
@Component
public class LogAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("方法調用前: " + joinPoint.getSignature().getName());}
}// 使用 @Transactional 注解(基于代理實現事務)
@Transactional
public void transferMoney(Account from, Account to, double amount) {// 轉賬邏輯
}

4.模版方法模式(Template Method Pattern)

作用:定義算法的骨架,將某些步驟延遲到子類中實現

場景:JdbcTemplate封裝了JDBC的固定流程

@Autowired
private JdbcTemplate jdbcTemplate;public List<User> getUsers() {return jdbcTemplate.query("SELECT * FROM users",(rs, rowNum) -> new User(rs.getString("name"), rs.getInt("age")));
}

5.觀察者模式(Observer Pattern)

作用:定義對象間的一對多依賴,當一個對象狀態變化時,自動通知依賴它的對象。

場景:Spring事件監聽機制


// 自定義事件
public class OrderEvent extends ApplicationEvent {public OrderEvent(String orderId) {super(orderId);}
}// 監聽器
@Component
public class OrderEventListener implements ApplicationListener<OrderEvent> {@Overridepublic void onApplicationEvent(OrderEvent event) {System.out.println("處理訂單事件: " + event.getSource());}
}// 發布事件
@Autowired
private ApplicationEventPublisher publisher;
public void createOrder() {publisher.publishEvent(new OrderEvent("ORDER_123"));
}

6.策略模式(Strategy Pattern)

作用:定義一系列算法,使其可以互相替換,獨立于客戶端發生變化

場景:Spring的ResourceLoader根據前綴選擇資源加載策略

ResourceLoader loader = new DefaultResourceLoader();
Resource fileResource = loader.getResource("file:/tmp/test.txt");
Resource classpathResource = loader.getResource("classpath:application.yml");

7.適配器模式(Adapter Pattern)

作用:將一個接口轉換成客戶期待的接口

場景:Spring MVC 的 HandlerAdapter 適配不同 Controller。

// 模擬 SimpleControllerHandlerAdapter 的適配邏輯
public class SimpleControllerHandlerAdapter implements HandlerAdapter {@Overridepublic boolean supports(Object handler) {return handler instanceof Controller;}@Overridepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) {return ((Controller) handler).handleRequest(request, response);}
}

8.裝飾器模式(Decorator Pattern)

作用:動態為對象添加額外職責

場景:Spring對HttpServletRequest的包裝

// 自定義裝飾器
public class LoggingRequestWrapper extends HttpServletRequestWrapper {public LoggingRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {System.out.println("獲取參數: " + name);return super.getParameter(name);}
}// 在 Filter 中使用
public class LogFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {chain.doFilter(new LoggingRequestWrapper((HttpServletRequest) request), response);}
}

9.責任鏈模式(Chain of Responsibility Pattern)

作用:將請求的發送者和接收者解耦,通過鏈式處理請求。

場景:Spring Security 的過濾器鏈。

// 模擬過濾器鏈
public class FilterChainDemo {private List<Filter> filters = new ArrayList<>();public void addFilter(Filter filter) {filters.add(filter);}public void doFilter(HttpServletRequest request) {for (Filter filter : filters) {filter.execute(request);}}
}// 使用
FilterChainDemo chain = new FilterChainDemo();
chain.addFilter(new AuthFilter());
chain.addFilter(new LoggingFilter());
chain.doFilter(request);

10.原型模式(prototype Pattern)

作用:通過復制現有對象來創建新對象,避免重復初始化開銷

場景:Spring 的 prototype 作用域 Bean。

@Component
@Scope("prototype")
public class PaymentService {// 每次獲取都是新實例
}// 測試
PaymentService bean1 = context.getBean(PaymentService.class);
PaymentService bean2 = context.getBean(PaymentService.class);
System.out.println(bean1 == bean2); // 輸出 false

11.建造者模式(Builder Pattern)

作用:分步驟構建復雜對象

場景:RestTemplateBuilder構建復雜對象

RestTemplate restTemplate = new RestTemplateBuilder().rootUri("https://api.example.com").defaultHeader("Authorization", "Bearer token").build();

概括

  • 解耦:工廠模式、代理模式。
  • 擴展性:策略模式、觀察者模式。
  • 復用性:模板方法模式、適配器模式。
  • 控制復雜度:責任鏈模式、裝飾器模式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85041.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ROM 只讀存儲器 隨機存取

ROM&#xff08;Read-Only Memory&#xff0c;只讀存儲器&#xff09;的存取方式為&#xff1a; ? 隨機存取方式&#xff08;Random Access&#xff09; 盡管“ROM”強調的是“只讀”&#xff0c;它的數據訪問方式與 RAM 類似&#xff0c;都是隨機存取。 &#x1f50d; 解釋如…

opensuse解決微信無法登錄的問題

思路啟發 https://forum.suse.org.cn/t/topic/17183/2 實際解決 https://forum.suse.org.cn/t/topic/17204/5 解決方法 先安裝 sudo zypper install execstackcd /opt/wechatsudo bash -c execstack -c ./*.so

Adixen ASM380 氦氣檢漏儀 阿爾卡特Mobile high performance helium leak detector

Adixen ASM380 氦氣檢漏儀 阿爾卡特Mobile high performance helium leak detector

堆的自動管理

由于程序員必須編寫出到分配和釋放存儲器的明確的調用&#xff0c;所以用m a l l o c和f r e e完成指針的動態分配和重新分配是管理堆的手工( m a n u a l )方法。相反地&#xff0c;運行時棧則是由調用序列自動地( a u t o m a t i c a l l y )管理。在一種需要完全動態的運行…

智能出入庫管理系統:自動化管控平臺

部隊裝備庫室智能管控系統是集智能化、集成化、網絡化于一體的綜合管理系統&#xff0c;由智慧營區庫室綜合管控平臺、出入口控制子系統、智能QD柜子系統、裝備物資管理子系統、視頻監控系統、入侵報警子系統、環境監測子系統等七大核心子系統構成。各子系統通過數據自動交互&a…

歸并排序:高效分治的藝術

歸并排序(Merge Sort)原理詳解 歸并排序是一種基于分治法(Divide and Conquer)的高效排序算法,由馮諾依曼于1945年提出。它的核心思想是將大問題分解為小問題,解決小問題后再合并結果。 核心原理 1. 分治策略(Divide and Conquer) 分(Divide):將無序數組遞歸地拆…

知識庫建設方案有哪些?全面解析

知識庫建設方案主要包括本地部署方案、云端在線方案、混合部署方案。其中&#xff0c;云端在線方案以其靈活性、實時更新能力和低維護成本&#xff0c;逐漸成為大多數企業的首選方案。云端在線方案可隨時隨地提供實時更新的知識內容&#xff0c;確保企業員工和客戶始終獲得最新…

政務大廳智能引導系統:基于數字孿生的技術架構與實踐

本文面向政務信息化開發者、系統集成工程師、智能導視領域技術人員。解析政務大廳智能引導系統的技術實現路徑&#xff0c;提供從定位導航到數據驅動的技術方案&#xff0c;助力解決傳統導視系統效率低下、體驗不佳的技術痛點。 一、技術架構全景&#xff1a;從物理空間到數字映…

java設計模式[2]之創建型模式

文章目錄 一 創建型模式1.1 單例模式的設計與實現1.1.1 餓漢式模式1.1.2 懶漢式單例模式1.1.3 懶漢式單例模式完善1.1.4 雙重檢測鎖式1.1.4.1 volatile關鍵字1.1.4.2 在雙重檢查鎖定中的作用 1.1.5 靜態內部類式單例模式1.1.6 枚舉式單例模式1.1.7 反射暴力破解解決方案1.1.8 序…

PHP設計模式實戰:構建高性能API服務

在前一篇電子商務系統設計的基礎上,我們將深入探討如何運用設計模式構建高性能、可擴展的API服務。現代Web應用越來越依賴API作為前后端分離架構的核心,良好的API設計對系統性能和維護性至關重要。 倉庫模式實現數據訪問層 倉庫模式(Repository Pattern)可以抽象數據訪問邏…

ComfyUI Flux.1 ACE++ 圖像編輯原理詳解

關注不迷路&#xff0c;點贊走好運&#xff01;&#xff01;&#xff01; ComfyUI Flux.1 ACE 圖像編輯原理詳解 ——從“拼圖游戲”到“魔法畫筆”的技術革命 目錄 ACE 的核心思想&#xff1a;用“指令”指揮圖像生成 1.1 什么是上下文感知內容填充&#xff1f;1.2 條件單元&…

Datawhale-爬蟲

task1-初始爬蟲 爬蟲用python好&#xff0c;python庫多&#xff0c;功能全 反爬機制和反反爬機制 顧名思義&#xff0c;一個是防范爬蟲的&#xff0c;一個是應對限制爬蟲的方法 好的&#xff0c;我們來更深入地探討反爬機制和反反爬策略的細節&#xff0c;包括具體的技術手段…

雙token三驗證(Refresh Token 機制?)

單token存在的問題 我們都知道&#xff0c;token是我們在前后端數據傳輸的時候為了保證安全從而必須需要進行設置的東西&#xff0c;他的主要作用實際上就是為了保證我們的數據安全&#xff0c;進行身份驗證和授權&#xff0c;并且相對于session而言更加適合如今的分布式系統&a…

青少年編程與數學 01-011 系統軟件簡介 22 VMware 虛擬化軟件

青少年編程與數學 01-011 系統軟件簡介 22 VMware 虛擬化軟件 一、歷史沿革&#xff08;一&#xff09;創立階段&#xff08;1998-2003&#xff09;&#xff08;二&#xff09;快速擴張&#xff08;2004-2010&#xff09;&#xff08;三&#xff09;云時代轉型&#xff08;2011…

FPGA基礎 -- Verilog門級建模之奇偶校驗電路

? 一、什么是奇偶校驗&#xff08;Parity Check&#xff09; &#x1f4cc; 定義&#xff1a; 奇偶校驗是一種錯誤檢測編碼方式&#xff0c;用于判斷一個二進制數據在傳輸或存儲過程中是否發生了單比特錯誤。 奇校驗&#xff08;Odd Parity&#xff09;&#xff1a;總共有奇…

UWB協議精讀:IEEE 802.15.4z-2020,15. HRP UWB PHY, STS, HRP-ERDEV, BPRF, HPRF,

跟UWB相關的IEEE標準主要有2個: 1,IEEE 802.15.4-2020 2,IEEE 802.15.4z-2020 IEEE Std 802.15.4z? ‐ 2020 Amendment 1: Enhanced Ultra Wideband (UWB) Physical Layers (PHYs) and Associated Ranging Techniques scrambled timestamp sequence (STS): A sequence of…

6.IK分詞器拓展詞庫

比如一些行業專業詞匯、簡單無意義詞&#xff08;例如&#xff1a;的、得、地、是等)、網絡流行詞、后來形成的詞、再或者一些禁忌詞&#xff08;比如&#xff1a;領導人的名字、黃賭毒犯罪等詞要排除的&#xff09; 在es的插件目錄下查找配置文件&#xff1a; 找到IKAnalyzer…

Web3-Web3.js核心操作:Metamask、合約調用、事件訂閱全指南

Web3-Web3.js核心操作&#xff1a;Metamask、合約調用、事件訂閱全指南 我們做了Solidity的合約代碼&#xff0c;但是合約僅僅是一個后端邏輯&#xff1b;我們想要讓用戶來操作你的邏輯還需要做一個基本的網頁。如果要做一個基本的網頁&#xff0c;我們就要使用到以太坊基金發布…

四色(定理/猜想)染色算法小軟件Version1.11

四色(定理/猜想)染色算法小軟件Version1.11 2025.6.16 開發者&#xff1a;路人甲/打醬油 增加了【自思肯普法】 為什么加上【自思】兩字&#xff1f;因為我也看不明英文的PDF的四色定理證明文檔&#xff0c;分什么成千上百種類來證明。我就是百度下&#xff0c;看相關介紹&am…

【Linux驅動開發 ---- 2_深入理解內核模塊】

Linux驅動開發 ---- 2_深入理解內核模塊 目錄 Linux驅動開發 ---- 2_深入理解內核模塊學習目標時間安排建議 理論學習1. 什么是內核模塊&#xff1f;2. 模塊加載與卸載3. 內核模塊開發基礎 實踐任務任務1&#xff1a;準備開發環境任務2&#xff1a;編寫簡單內核模塊任務3&#…