《Spring揭秘》-第二章- 學習記錄

来源:https://www.cnblogs.com/zc-01/archive/2023/04/10/17304699.html
-Advertisement-
Play Games

何為請求限流? 請求限流是一種控制API或其他Web服務的流量的技術。它的目的是限制客戶端對伺服器發出的請求的數量或速率,以防止伺服器過載或響應時間變慢,從而提高系統的可用性和穩定性。 中小型項目請求限流的需求 按IP、用戶、全局限流 基於不同實現的限流設計(基於Redis或者LRU緩存) 基於註解 ...


1、IoC的理念

IoC全稱為Inversion of Control,中文翻譯為控制反轉,同時還有一個別名叫 依賴註入DI(Dependency Injection)。大多將IoC與DI看作同等概念,也有部分觀點認為 依賴註入可以看作IoC的一種實現方式。

在沒有Spring的時候,當我們需要依賴某個類或服務時,一般通過new創建一個對象(或者通過ServiceLocator解決直接的依賴耦合),這些都需要主動的去獲取需要的對象。

ServiceLocator是通過引入中間代理者消除對象間複雜的耦合關係,並統一管理分散的複雜耦合關係。

IoC的出現就為我們提供了更加簡潔的方式,不用主動去構造對象,將“主動獲取”轉變為“被動接收”,下圖即為IoC在整個過程中的所承擔的角色
file
通常情況下,被註入對象會直接依賴於被依賴對象。但是在IoC的場景中,二者通過IoC Service Provider來交互,全部由IoC Service Provider統一管理。控制權由被註入對象轉變為了IoC Service Provider 那裡。

public class NewsProvider {
	// NewsProvider 為被註入對象
	// INewsListener和INewsPersister為被依賴對象
	private INewsListener newsListener;
	private INewsPersister newsPersister;
}

其實IoC就是這麼簡單!以前是需要什麼自己去拿,現在是需要什麼東西別人主動送過來。下圖形象的說明瞭使用IoC模式的前後差別
file

2、IoC(DI)的幾種依賴註入的方式

IoC模式最常用的有三種依賴註入方式,分別是構造方法註入(Constructor Injection)、setter方法註入(Setter Injection)以及介面註入(Interface Injection)。

2.1、構造方法註入

構造方法註入即 被註入對象可以通過在其構造方法中聲明所依賴對象的參數列表,讓IoC容器知道它所需要的依賴對象列表。由於同一個對象是不可能是被構造兩次的,因此,被註入對象的構造乃至其整個生命周期,都是由IoC Service Provider來管理的。

IoC Service Provider會檢查被註入對象的構造方法,取得它所需要的依賴對象列表,進而為其註入相應的對象。具體代碼示例如下

public class NewsProvider {
	// NewsProvider 為被註入對象
	// INewsListener和INewsPersister為被依賴對象
	private INewsListener newsListener;
	private INewsPersister newsPersister;
	
	public NewsProvider(INewsListener newsListener, INewsPersister newsPersister) {
		this.newsListener = newsListener;
		this.newsPersister = newsPersister;
	}
}

構造方法註入的方式比較直觀,對象被構造完成後,就進入了就緒裝填,可以馬上使用。

2.2、setter方法註入

對於JavaBean對象來說,通常會通過setter方法來更改相應的對象屬性。所以,當前對象只要為其依賴對象所對應的屬性添加setter方法,就可以通過setter方法將相應的依賴對象設置到被註入對象中。代碼示例如下

public class NewsProvider {
    // NewsProvider 為被註入對象
    // INewsListener和INewsPersister為被依賴對象
    private INewsListener newsListener;
    private INewsPersister newsPersister;
    
    public void setNewsListener(INewsListener newsListener) {
        this.newsListener = newsListener;
    }
    public void setNewsPersister(INewsPersister newsPersister) {
        this.newsPersister = newsPersister;
    }
}

這樣,外界就可以通過調用setNewsListener和setNewsPersister方法來註入依賴對象了。

需要註意的是,setter方法註入不像構造方法註入那樣,對象構造完成後即可使用,相對而言更加寬鬆一些,可以在對象構造完成之後再註入。

2.3、介面註入(基本廢棄)

相對前面的兩種註入方式來說,介面註入會更加複雜。被註入對象如果想讓IoC Service Provider為其註入依賴對象,就必須實現某個介面。這個介面提供一個方法,用來為其註入依賴對象。IoC Service Provider 最終會通過這些介面來獲取被註入對象所需要的依賴對象列表。

NewsProvicer為了讓IoC Service Provider 為其註入所依賴的NewsListener對象,首先需要實現一個介面 INewsListenerCallable(名稱隨意),這個介面會聲明一個injectNewsListener方法(名稱隨意),重要的是該方法的參數,必須是所依賴對象的類型。這樣,對應的IoC Service Provider 就可以通過這個介面方法將依賴對象註入到 被註入對象 NewsProvider 當中。代碼示例如下。

public interface NewsListenerCallable {
    // 聲明方法
    void injectNewsListener(INewsListener newsListener);
}

public class NewsProvider implements NewsListenerCallable{
    private INewsListener newsListener;
    @Override
    public void injectNewsListener(INewsListener newsListener) {
        this.newsListener = newsListener;
    }
}

2.3、三種註入方式的比較

  • 構造方法註入。這種註入方式的優點就是,對象在構造完成之後,就已進入就緒狀態,可以馬上使用。缺點就是,當依賴對象變多時,構造方法的參數列表會比較長。同時通過反射構造對象時,對相同類型的參數處理會比較困難,維護和使用上也比較麻煩。而且在Java中,構造方法無法被繼承,無法設置預設值。對於非必須的依賴處理,可能還需要引入多個構造方法,維護不便。
  • setter方法註入優點就是,在描述性上會比構造方法註入要好,同時可以被繼承,允許設置預設值,而且有良好的IDE支持。缺點就是對象無法在構造完成後立馬進入就緒狀態。
  • 介面註入。從註入方式的使用上來說,介面註入是目前不提倡的一種方法,基本處於“退役狀態”。因為需要被註入對象實現不必要的介面,帶有侵入性。

綜上,構造方法註入和setter註入因為其侵入性較弱,且易於理解和使用,所以是現在使用最多的註入方式;而介面註入由於其侵入性,已經不流行了。

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用CSS描繪頁面樣式時,顏色是其中不可或缺的,無論是對文本、背景還是邊框、陰影,我們都寫過無數代碼用來增添顏色。而為了讓網頁的色彩表現更出色,我們很有必要完整梳理下CSS中的色彩。 要講清楚CSS中的顏色,離不開顏色模型的概念,這是我們需要先瞭解的。 顏色模型 顏色模型電腦中用來描述顏色的數學模 ...
  • Sourcemap(源代碼映射)用於將生產環境中的壓縮代碼映射回原始的源代碼。在前端開發過程中,JavaScript、CSS 和其他文件通常會被壓縮和混淆,以減小文件大小和提高網站載入速度。然而,這會讓調試和錯誤定位變得困難,因為生產環境中的代碼難以閱讀和理解。 Sourcemap 的作用是在開發和 ...
  • 本文旨在通過部署微前端項目的實踐過程中沉澱出一套部署方案,針對項目分別部署在不同的伺服器上的場景,就一些重點步驟、碰到的問題做了一些總結。 ...
  • 回到十年前,前端技術就像一名戴著厚重眼鏡的書呆子,總是小心翼翼,被各種各樣的瀏覽器相容性問題欺負(就像在小學被欺負一樣)。 ...
  • 本文使用Three.js實現一個可以應用到實際項目中的3D線上看房案例。通過閱讀本文和實踐案例,你將學到的知識包括:使用 Three.js 實現多個場景的載入和場景間的絲滑過渡切換、隨著空間一直和角度實時變化的房源小地圖、在全景場景中添加如地面指引、空間物體展示、房間標註等多種類型的交互熱點等。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 瞭解排序演算法的優缺點和適用場景是非常重要的,因為在實際開發中,需要根據實際情況選擇最合適的排序演算法。不同的排序演算法適用於不同的場景,有的演算法適用於小規模的數據集,有的演算法適用於大規模的數據集,有的演算法適用於穩定排序,有的演算法適用於不穩定排 ...
  • 在開發中我們有時候需要每隔 一段時間發送一次電子郵件,或者在某個特定的時間進行發送郵件,無需手動去操作,基於這樣的情況下我們需要用到了定時任務,一般可以寫個定時器,來完成相應的需求,在 node.js 中自已實現也非常容易,接下來要介紹的是node-schedule來完成定時任務 ...
  • @Configuration 標註在類上,啟動 Spring 會自動掃描@Configuration註解的類,將其註冊到IOC容器並實例化bean對象。如果在@Configuration註解的類中使用@Bean註解某個類對象的方法,Spring也會自動將註解了@Bean的方法註冊到IOC容器,併進行 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...