Spring IOC官方文檔學習筆記(四)之依賴項(下)

来源:https://www.cnblogs.com/shame11/archive/2022/12/24/17003007.html
-Advertisement-
Play Games

一、選題的背景 (1)為什麼要選擇此選題? 樂高是一個很受歡迎的玩具積木品牌,它們通常是成套出售的,用來製作特定的物品,每一套都包含許多不同形狀、大小和顏色的零件。它是一個有趣的數據集合,它包含了多年來集合的綜合列表,以及每個集合包含的部分數。提供了許多可供探索的空間,特別是因為“集合”文件包含了集 ...


3.depends-on

(1) depends-on用來表示一個bean的實例化依靠另一個bean的先實例化,如果在一個bean A上定義了depends-on bean B就表示:bean A實例化前先實例化bean B。

<!-- 例一 -->
<beans ...>
    <!-- 對於下麵這倆個bean,誰先誰後創建不能確定 -->
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>
    <bean id="exampleB" class="cn.example.spring.boke.ExampleB"></bean>
</beans>

<!-- 例二 -->
<beans ...>
    <!-- exampleB depends-on exampleA,因此exampleA會先於exampleB被創建 -->
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>
    <bean id="exampleB" class="cn.example.spring.boke.ExampleB" depends-on="exampleA"></bean>
</beans>

4.懶載入

(1) 預設情況下,Spring會在容器啟動時初始化所有的singleton bean,因為在這種情況下,某些配置錯誤會儘早發現,但如果我們不想提前初始化bean,就可以指定bean的lazy-init屬性,來延遲初始化bean,這樣這個bean會在第一次請求時被初始化而非在容器啟動時被初始化

<beans ...>
    <!-- exampleA會在第一次請求時被初始化 -->
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA" lazy-init="true"></bean>
    <!-- exampleB會在容器啟動時被初始化 -->
    <bean id="exampleB" class="cn.example.spring.boke.ExampleB"></bean>
</beans>

(2) 註意:當延遲初始化的bean是非延遲初始化的bean的依賴項時,延遲初始化就失效了,它也會在容器啟動時被初始化,因為容器在啟動時必須為這個非延遲初始化的bean註入依賴項

(3) 使用beans標簽上的default-lazy-init屬性批量設置延遲初始化的bean

<beans default-lazy-init="true"> 
  <!-- 相當於給容器內的每一個bean都提供了lazy-init=true屬性 --> 
</beans>

4.自動裝配

(1) 對於存在依賴關係的多個bean,我們可以通過ref屬性來手動註入依賴項,同時,如果不想手動,可通過設置bean標簽的autowire屬性來開啟Spring的自動裝配功能,它會按照所給的策略來自動的註入依賴項,相較於手動裝配,其具有自動更新配置,簡化代碼等優點,如下

<!-- 例一:手動裝配 -->
<beans ...>
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>

    <bean id="exampleB" class="cn.example.spring.boke.ExampleB">
        <!-- 使用ref來配置依賴項 -->
        <property name="exampleA" ref="exampleA"></property>
    </bean>
</beans>

<!-- 例二:自動裝配 -->
<beans ...>
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>
    
    <!-- autowire屬性設置為byType,告訴容器來按照類型進行依賴項的註入 -->
    <bean id="exampleB" class="cn.example.spring.boke.ExampleB" autowire="byType"></bean>
</beans>

(2) 自動裝配策略,即autowire屬性的取值:

策略 描述
no 預設選項,即不進行自動裝配,bean之間的依賴關係通過指定ref屬性來手動裝配
byName 根據屬性名稱進行自動裝配,Spring會尋找與屬性名同名的bean來進行裝配,比如上面的例子中,exampleB對象有一個名為exampleA的成員變數,則Spring會在容器中尋找id為exampleA的這個bean進行註入
byType 根據屬性類型進行自動裝配,如果容器中恰好存在一個同類型的bean,則會進行自動裝配,如果存在多個,則會拋出異常,如果沒有該類型的bean,則什麼也不會發生,屬性不會被註入
constructor 類似於byType,不過針對的是構造函數參數進行的自動裝配,如果容器中不存在類型跟構造函數參數的類型一樣的bean時,將引發異常

此外,可通過byType或constructor策略,來對數組或集合進行自動裝配,註入與類型相匹配的所有bean,如下

public class ExampleA {}

//ExampleB中存在一個類型為ExampleA的集合,希望通過這個集合來接收容器內所有類型為ExampleA的bean
public class ExampleB {
    private List<ExampleA> exampleAList;

    public void setExampleAList(List<ExampleA> exampleAList) {
        this.exampleAList = exampleAList;
    }
}

<!-- xml配置文件 -->
<beans ...>
    <!-- 定義了兩個類型為ExampleA的bean -->
    <bean id="exampleA1" class="cn.example.spring.boke.ExampleA"></bean>
    <bean id="exampleA2" class="cn.example.spring.boke.ExampleA"></bean>

    <!-- autowire為byType,此時Spring會向exampleAList中註入上面定義的兩個bean -->
    <bean id="exampleB" class="cn.example.spring.boke.ExampleB" autowire="byType"></bean>
</beans>

(3) 自動裝配的缺陷:

  • 在property或constructor-arg標簽中手動指定的bean會覆蓋掉自動裝配的bean,此外,自動裝配不同裝配一些簡單類型,如int,boolean,String等

  • 自動裝配不如手動顯式指定精確

  • 如果容器中存在同一類型的多個bean時,由於容器有時不知道該裝配哪一個,從而會引發異常(解決方案:1.放棄自動裝配改為手動裝配 2.將不期望裝配的bean的autowire-candidate屬性設為false,容器在尋找依賴項時會忽略掉這個bean 3.將期望裝配的bean的primary屬性設為true,容器會首先裝配這個bean)

(4) 在自動裝配過程中排除bean:通過bean標簽中的autowire-candidate屬性(該屬性只會影響byType策略,對於byName無效),來設置當前bean在自動裝配過程中是否作為候選bean,預設值為true,當設置為false時,表示當前bean不作為候選bean,即容器在尋找依賴項時會忽略掉這個bean,例子如下

public class ExampleA {}

//ExampleB依賴ExampleA
public class ExampleB {
    private ExampleA exampleA;

    public void setExampleAList(ExampleA exampleA) {
        this.exampleA = exampleA;
    }
}

<!-- xml配置文件 -->
<beans ...>

    <!-- 如果這裡不將exampleA1的autowire-candidate屬性設置為false,那麼容器中就會有兩個類型為ExampleA的bean,在自動裝配時,容器會拋出NoUniqueBeanDefinitionException -->
    <!-- exampleA1的autowire-candidate為false,那麼容器在尋找依賴項時就會忽略這個bean,因此會將exampleA2進行註入 -->
    <bean id="exampleA1" class="cn.example.spring.boke.ExampleA" autowire-candidate="false"></bean>
    <bean id="exampleA2" class="cn.example.spring.boke.ExampleA"></bean>

    <bean id="exampleB" class="cn.example.spring.boke.ExampleB" autowire="byType"></bean>
</beans>

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

-Advertisement-
Play Games
更多相關文章
  • 這是我大約半年前就想寫的隨筆。 功能很簡單。 就是基於Geometry的畫布,記錄滑鼠軌跡生成PathGeometry。再就是添加刪除Path的功能也就是path筆跡刪除。 目前是實現了兩種方式。 1 基於預覽擦除 2 實時擦除 兩者在具體技術上沒有任何的區別都是依靠Geometry.Combine ...
  • SQL優化中,有一條放之四海而皆準的既定方針,那就是:永遠以小數據驅動大數據。其本質其實就是以小的數據樣本作為驅動查詢能夠優化查詢效率,在SQL中,涉及到不同表數據的連接、轉移、或者合併,這些操作必須得有個數據集作為“帶頭”大哥,即驅動數據,而這個驅動數據最好是數據量最小的那一個。 內大外小 在討論 ...
  • Mysql 作為互聯網中非常熱門的資料庫,其底層的存儲引擎和數據檢索引擎的設計非常重要,尤其是 Mysql 數據的存儲形式以及索引的設計,決定了 Mysql 整體的數據檢索性能。 ...
  • Web 標準 & W3C 規範 引用 最全面的前端筆記來啦,包含了入門到入行的筆記,還支持實時效果預覽。小伙伴們不需要在花時間去寫筆記,或者是去網上找筆記了。面試高頻提問和你想要的筆記都幫你寫好了。支持移動端和PC端閱讀,深色和淺色模式。 原文鏈接:https://note.noxussj.top/ ...
  • 在JS中,類是後來才出的概念,早期創造對象的方式是new Function()調用構造函數創建函數對象; 而現在,可以使用new className()構造方法來創建類對象了; 所以在很多方面,類的使用方式,很像函數的使用方式: 但是類跟函數,還是有本質區別的,這在原型那裡已經說過,不再贅述; 如何 ...
  • 好家伙,本篇為《JS高級程式設計》第八章“對象、類與面向對象編程”學習筆記 1.工廠模式 工廠模式是另外一種關註對象創建概念的創建模式。 它的領域中同其它模式的不同之處在於它並沒有明確要求我們使用一個構造器。 取而代之,一個工廠能提供一個創建對象的公共介面,我們可以在其中指定我們希望被創建的工廠對象 ...
  • ​ 目錄 1.前言 2.目標與效果展示 3.下載OpenCV圖形識別庫 4.下載python支持的v2模塊 5.圖片素材 6.代碼 1.前言 ​ 編輯 Merry Christmas!今天是2022年12月24日,今晚是平安夜在這裡提前祝大家聖誕節快樂! 大家可能對@官方微信給自己的頭像加上一頂聖誕 ...
  • 摘要:教你如何用java實現每日給女友微信發送早安等微信信息。 本文分享自華為雲社區《java實現每日給女友微信發送早安等微信信息》,作者:穆雄雄 。 前言 據說這個功能最近在抖音上很火,我沒有抖音,沒有看到。 但是我在網上看了,相關案例確實很多,但是大家都是藉助於了微信服務號,在我看來,效果很不佳 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...