Spring框架的設計模式

Spring 框架深度集成了多種經典設計模式,這些模式支撐了其核心功能(如IoC、AOP)的實現,以下是關鍵模式及其應用場景的梳理:

1、工廠模式

工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯。并且是通過使用一個共同的接口來指向新創建的對象。Spring 中可以使用工廠模式通過 BeanFactory 或者 ApplicationContext 創建 Bean 對象。BeanFactory 和 ApplicationContext 是核心工廠接口,封裝 Bean 的創建邏輯;FactoryBean 擴展工廠能力,支持復雜對象(如 SqlSessionFactoryBean)的定制化構建。

2、單例模式

單例模式是指一個類全局只有一個實例,Spring 框架中默認的 Bean 是單例的。Spring 容器默認以單例作用域管理 Bean(@Scope("singleton")),避免重復創建無狀態對象(如 Service、DAO 層組件),減少資源消耗。底層是通過 ConcurrentHashMap 注冊表管理單例實例。

面試題:Spring 框架管理的 Bean 使用單例模式,是如何解決線程安全問題?

答:(1)通過使用 ThreadLocal 實現線程隔離,ThreadLocal 會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。

(2)若需共享可變狀態,則顯式使用 ConcurrentHashMap、AtomicInteger 等線程安全容器,或通過 synchronized/ReentrantLock 同步關鍵代碼塊。

3、適配器模式

適配器模式(Adapter Pattern)是作為兩個不兼容的接口之間的橋梁。例如,舊的接口規范和新的接口調用方式不兼容,在這種情況下,可以在中間添加一個適配器,適配器提供新的接口調用方式,但是在內部使用的是舊的接口。Spring AOP 模塊對 BeforeAdvice、AfterAdvice 和 ThrowsAdvice 三種通知類型的支持實際上是借助適配器模式來實現的。

4、裝飾器模式

裝飾器模式是指動態給一個對象添加一些額外的職責,就增加功能來說,裝飾者比繼承更加靈活。例如,已經有個登錄功能,需要添加一個新功能,登錄的時候發送短信通知。Spring 中用到的裝飾器模式在類名上有兩種表現:一種是類名中含有 Wrapper,另一種是類名中含有 Decorator。基本上都是動態地給一個對象添加一些額外的職責。

5、代理模式

代理模式是指一個類代表另一個類的功能,Spring 的 AOP 實現基本上都是通過代理模式,代理模式和裝飾器模式實現方法很類似,它們的區別是裝飾器模式是對現有功能的擴展,代理模式是完成其他的功能。例如登錄的時候發送短信是對登錄功能的擴展,是裝飾器模式,如果登錄之前需要網絡檢查,請求簽名是通過代理實現。

6、觀察者模式

觀察者模式又被稱為發布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知所有的觀察者對象,使他們能夠自行更新。Spring 中的 ApplicationListener 就是使用的觀察者模式。

7、模板方法模式

模板方法模式是類的行為模式。先準備一個抽象類,將部分邏輯以具體方法以及具體構造方法的形式實現,然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。這就是模板方法模式的用意。Spring 以 Template 結尾都是模板方法,例如數據庫訪問的類 JdbcTemplate 和 HTTP 請求的類 RestTemplate。

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

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

相關文章

git報錯fatal: 遠端意外掛斷了

git報錯fatal: 遠端意外掛斷了 報錯詳細內容 mr.mbogon tinymce % git add . mr.mbogon tinymce % git commit -m init [master c6cfc2a] init1 file changed, 2 insertions(), 1 deletion(-) mr.mengbogon tinymce % git push 枚舉對象中: 241, 完成…

Windows 下安裝 NVM

NVM 下載 NVM 在工作中,你可能遇到過某個項目需要高版本的 node 才能運行,而有的項目可能只支持低版本的 node,此時就可以借助于一些 Node 版本管理工具,比如 nvm(Node Version Manager),幫助…

AI知識補全(十七):通用人工智能AGI是什么?

名人說:博觀而約取,厚積而薄發。——蘇軾《稼說送張琥》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 上一篇:AI知識補全(十六):A2A - 谷歌開源的agent通信協議是什么? 目錄 一、什么是AGI?概念解析1. 什么是AGI2. AGI與現有AI的本質區別二 、AGI的核…

Spring Cloud Gateway 介紹

什么是Spring Cloud Gateway? Spring Cloud Gateway 是 Spring Cloud 社區官方推出的一個基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.x 的下一代 API 網關(API Gateway)解決方案。它旨在為微服務架構提供統一、簡潔、高效的…

slam--高斯分布

教程 博主解釋 高斯分布 高斯分布(Gaussian Distribution),又稱正態分布(Normal Distribution),是描述連續型隨機變量分布規律的一種概率分布。 (1) 一維高斯分布 μ:均值/數學期望&#xff0…

機器視覺標定講解

B站 :道傳科技上位機 觀看教程 一、什么是相機標定 相機標定(Camera Calibration)是指通過實驗或算法手段確定相機的內部參數(如焦距、主點坐標、畸變系數)和外部參數(如旋轉矩陣、平移向量&#xff0…

文件的秒傳、分片上傳以及斷點續傳 || Redis緩存減輕數據庫讀寫壓力

實現文件的秒傳、分片上傳以及斷點續傳的功能。使用 Redis 緩存上傳的文件分片信息減輕數據庫讀寫壓力,同時防止有人惡意攻擊服務器導致服務器磁盤爆滿無法提供服務。 🔍 詳解: 1. 實現文件的秒傳、分片上傳以及斷點續傳功能 秒傳&#xff0…

安全大模型智驅網絡和數據安全效能躍遷

從2023年ChatGPT開始,網絡安全行業就一直嘗試和AI大模型來結合,解決網絡安全的痛點,例如告警多,專家少,新的APT攻擊層出不窮,已有的基于規則的防護手段失靈,如何使用大模型的泛化能力來提升對未…

Android S - 恢復部分應用安裝

使用展銳提供的代碼編譯出來的固件&#xff0c;不包含DeskClock等應用。 之前也遇到過這個情況&#xff0c;只是時間太久忘記了&#xff0c;在這里再次記錄&#xff01; frameworks/native/data/etc/android.app.remove.xml<?xml version"1.0" encoding"ut…

android 之 CALL

一、組件職責與定位 組件所在進程核心職責關鍵特性CallsManagerTelecom系統進程通話狀態機核心&#xff1a;管理所有Call對象的生命周期&#xff08;創建、狀態更新、銷毀&#xff09;。監聽Call狀態變化并通知所有觀察者&#xff08;如InCallController&#xff09;。通過mLi…

Swift 6 學習筆記(二)The Basics

這篇筆記也是同步 Swift 6 官方教程中的第二篇 《The Basics》&#xff0c;這篇博客中的大部分內容在第一篇中已經涉及&#xff0c;這篇可以被認為是基礎類型的的補充篇&#xff0c;多了很多說明信息。 官方教學文檔 《The Basics》&#xff1a; Swift 提供了許多基本數據類型…

【PHP】BC Math 函數參考表

BC Math 函數參考表: 函數名描述語法bcadd兩個任意精度數字的加法bcadd($num1, $num2, [scale])bcsub兩個任意精度數字的減法bcsub($num1, $num2, [scale])bcmul兩個任意精度數字乘法bcmul($num1, $num2, [scale])bcdiv兩個任意精度數字除法bcdiv($num1, $num2, [scale])bcmod…

C# TAP異步編程(Task/async/await)總結

C#中有個很好用的東西&#xff0c;TAP異步編程&#xff08;Task-based Asynchronous Pattern&#xff09;&#xff0c;是目前C#推薦的異步編程模型。它基于 System.Threading.Tasks.Task 和 async/await 關鍵字&#xff0c;旨在簡化異步代碼的編寫、調試和維護。TAP 是現代 .NE…

達夢數據庫(DM)用戶名大小寫處理規則

達夢數據庫(DM)用戶名大小寫處理規則 達夢數據庫對用戶名的處理與PostgreSQL和Oracle有所不同&#xff0c;以下是相關說明&#xff1a; 一、基本規則 默認情況下&#xff1a;達夢數據庫區分用戶名大小寫 創建的用戶名會保留原始大小寫格式連接時必須使用相同的大小寫形式 …

黑馬點評面試話術

文章目錄 1.項目介紹2. 分布式登錄功能2.1 講講登錄的整個流程2.2 集群模式session下存儲用戶信息會有啥問題&#xff1f;2.3 為什么采用redis存儲用戶信息和驗證碼2.4 redis的存儲格式怎么樣的&#xff1f;2.5 為什么采用Hash結構存儲用戶信息2.6 為什么采用雙攔截器&#xff…

MTK APEX測光系統中各變量具體的計算方式探究

目錄 一、APEX測光系統介紹 二、MTK測光系統實例介紹 三、關于測光系統的一些疑問 一、APEX測光系統介紹 詳細內容可以參考; AE(自動曝光)系統簡介

K8S的基本概念

Kubernetes是一個開源的容器編排部署管理平臺,用于管理云平臺中多個主機上的容器化應用。Kubernetes的目標是讓部署容器化的應用簡單并且高效,Kubernetes提供了應用部署、規劃、更新、維護的一種機制。 對應用開發者而言,可以把Kubernetes看成一個集群操作系統。Kubernetes…

NLP學習路線圖(三十四): 命名實體識別(NER)

一、命名實體識別(NER)是什么? 命名實體識別(Named Entity Recognition, NER)是自然語言處理中的一項關鍵序列標注任務。其核心目標是從非結構化的文本中自動識別出特定類別的名詞性短語,并將其歸類到預定義的類別中。 核心目標:找到文本中提到的命名實體,并分類。 典…

大三自學筆記:探索Hyperlane框架的心路歷程

## Day 1&#xff1a;初識 Hyperlane 在 GitHub 上發現了 Hyperlane 這個 Rust HTTP 框架&#xff0c;立刻被它的性能數據吸引。官方文檔寫著&#xff1a; > "hyperlane 是一個高性能且輕量級的 Rust HTTP 框架&#xff0c;設計目標是簡化現代 Web 服務的開發&#xff…

Java大廠面試真題:謝飛機的技術挑戰

Java大廠面試真題&#xff1a;謝飛機的技術挑戰 場景一&#xff1a;電商場景 面試官&#xff1a;在電商項目中&#xff0c;我們通常需要處理大量的并發請求。請談談你對JVM調優的理解。 謝飛機&#xff1a;嗯&#xff0c;JVM調優主要是為了提高程序的性能和穩定性。比如&…