【Spring】-Spring的IoC和DI

作者:學Java的冬瓜
博客主頁:?冬瓜的主頁🌙
專欄:【Framework】
主要內容:什么是spring?IoC容器是什么?如何使代碼解耦合?IoC的核心原理,IoC的優點。依賴注入/對象裝配/DI。

在這里插入圖片描述

在這里插入圖片描述

文章目錄

    • 一、什么是Spring?
      • 1)什么是IoC容器?
        • 1> 理解
        • 2> 法一,傳遞(存在依賴關系傳對象)
        • 3> 法二,使用Spring
          • Spring IoC 核心操作:
          • Spring IoC 優點:
      • 2)什么是DI?

一、什么是Spring?

Spring:包含了 眾多工具方法IoC 容器。

1)什么是IoC容器?

1> 理解

IoC 全稱 Inversion of Control,翻譯為控制反轉。因此IoC容器就是控制反轉的容器。那啥是 控制反轉?Spring框架管理Bean的創建工作。即由用戶管理Bean變為框架管理Bean

① 舉個例子:接下來我們舉個例子,并使用代碼來感受啥是個IoC(控制反轉),有什么好處:
比如建造一個房子,粗略的看,首先需要打地基,然后砌磚,最后掛房梁瓦片等。如果用代碼實現這樣一個粗略的過程,看下面代碼:

//測試類
public class Test {public static void main(String[] args) {House house = new House();house.init();}
}
//房
public class House {public void init(){// 創建房子 依賴于掛房梁等操作Beam beam = new Beam();beam.init();System.out.println("House: House create");}
}
//房梁
public class Beam {private String material;//(杉木)public void init(){// 掛房梁等 依賴于 砌好磚Brick brick = new Brick();brick.init();System.out.println("Bean: 房梁木用 " + this.material);}
}
//磚
public class Brick {private String redBrick;//紅磚public void init(){// 砌磚 依賴于 已經打好地基Foundation foundation = new Foundation();foundation.init();System.out.println("Brick: 砌磚用 " + this.redBrick);}
}
//地基
public class Foundation {private String rebar;//鋼筋private String cement;//水泥public void init(){System.out.println("Foundation: 打地基用 " + this.rebar +" "+ this.cement);}
}

上述代碼運行結果如下:
在這里插入圖片描述

② 理解代碼:上面的代碼中,測試類中的main方法運行后,會創建一個空House對象,再進行House對象的初始化;在House對象初始化時,會創建一個空的Beam對象,然后進行beam對象的初始化(house依賴于beam,房子依賴于房梁);beam初始化時,會創建Brick對象,再進行brick對象的初始化(beam依賴于brick,房梁依賴于砌好磚);brick對象初始化時,會創建Foundation對象,并進行foundation對象的初始化。
簡單來說,要想建房子,得先掛好房梁,要想掛房梁,得先砌好磚,要想砌磚,得先打好地基,這就是一個逐層調用進行初始化的過程,最終建好一個房子。但是這樣操作會引入一個很致命的問題:代碼耦合度非常高!

③ 問題:這樣互相依賴的過程,如果底層的類發生改變,上層的類得相應改變。在上面代碼中,我使用鋼筋水泥打地基,用紅磚來砌磚,用杉木來做房梁木,在每個類的調用init方法時將所需參數傳進去,進行材料的初始化(我這里沒弄,所以都是null)。那么理解到這里我們可以想一個問題,如果我不再使用紅磚來砌磚,而是使用水泥磚了,或者我需要制定特定尺寸的磚,那么Brick類的屬性就需要修改調整。這樣在上層調用中(beam)也需要修改,在Beam類的init方法中,創建了Brick類,并使用brick.init(參數)這個方法進行砌磚的初始化,那么這里也是需要修改的,如果上層還有給brick傳參的方法,那也還需要改,所以這樣操作,代碼耦合度會非常高。

④ IoC和Spring:怎么才能降低耦合,減少修改的成本?因為上述代碼出現高耦合的原因:在當前類中的方法中,創建當前類所依賴的類的對象并逐層調用初始化對象,或者上層的代碼給底層的類的屬性傳參數。
法一:當存在依賴關系時,在當前類的方法中不再自己創建和銷毀所依賴的對象,而是讓調用者傳一個依賴對象給當前類(當前類需要一個成員變量是它所依賴的類),如果這個類還存在其他屬性,也由調用者提供參數(這樣就可保證,在我需要修改某一個類的成員或者類型時,其他類不需要做修改,即實現解耦合)。
法二:那如果我不讓它逐層調用,而是統一交給一個工具去創建對象并初始化并管理對象呢?這就是控制反轉,Spring就是管理對象的這樣一個容器。

⑤ Spring:在管理方面,Spring是一個 IoC容器,它可以管理對象,包括創建銷毀對象等。在操作方面,又因為是個 IoC容器,因此可以把對象存進Spring或者從Spring中獲取對象。

2> 法一,傳遞(存在依賴關系傳對象)

//測試類
package demo2;
public class Test {//測試傳對象 解耦合代碼public static void main(String[] args) {Foundation foundation = new Foundation("xx號鋼筋", "xx號水泥");Brick brick = new Brick(foundation, "xx號紅磚");Beam beam = new Beam(brick, "杉木");House house = new House(beam);house.init();}
}//House類
package demo2;
public class House {private Beam beam;public House(Beam beam){this.beam = beam;}public void init(){// 創建房子 依賴于掛房梁等操作beam.init();System.out.println("house: 房子建成");}
}//Beam類
package demo2;
public class Beam {private Brick brick;private String material;public Beam(Brick brick, String material){this.brick = brick;this.material = material;}public void init(){// 掛房梁等 依賴于 砌好磚brick.init();System.out.println("Bean: 房梁木用 " + this.material);}
}//Brick類
package demo2;
public class Brick {private Foundation foundation;private String redBrick;//紅磚public Brick(Foundation foundation, String redBrick){// 砌磚 依賴于 已經打好地基this.foundation = foundation;this.redBrick = redBrick;//新增}public void init(){this.foundation.init();System.out.println("Brick: 砌磚用 " + this.redBrick);}
}//Foundation類
package demo2;
public class Foundation {private String rebar;//鋼筋private String cement;//水泥public Foundation(String rebar, String cement){this.rebar = rebar;this.cement = cement;}public void init(){System.out.println("Foundation: 打地基用 " + this.rebar +" "+ this.cement);}
}

運行結果:
在這里插入圖片描述

3> 法二,使用Spring

具體操作,看后面的博客

Spring IoC 核心操作:

存對象 取對象

Spring IoC 優點:

解耦合
使用方便(不再需要手動創建對象)
更加高效(默認情況,使用相同類只需要創建一個對象)

2)什么是DI?

IoC,(Inversion of Control 控制反轉)是一種設計原則,指的是將對象的創建和依賴關系交給容器來完成而不是由對象自己管理依賴對象。
DI,(Dependency Injection 依賴注入),是IoC的一種具體的實現方式,它是通過將依賴對象注入到對象中來實現對象之間的解耦。
簡而言之,IoC是一種思想,而DI是IoC的一種具體實現方式

補充1:實現IoC除了DI之外,還需要控制反轉容器(在Spring中就是Spring容器)和配置信息(xml文件,描述對象和依賴關系的元數據)。

補充2:① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩(在這里列出這種序號,需要的自取)。

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

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

相關文章

【ARM 嵌入式 編譯系列 10 -- GCC 編譯縮減可執行文件 elf 文件大小】

文章目錄 GCC 如何縮減可執行文件size測試代碼 上篇文章:ARM 嵌入式 編譯系列 9-- GCC 編譯符號表(Symbol Table)的詳細介紹 下篇文章:ARM 嵌入式 編譯系列 10.1 – GCC 編譯縮減可執行文件 elf 文件大小 GCC 如何縮減可執行文件s…

Linux下在qtcreator中創建qt程序

目錄 1、新建項目 2、單工程項目創建 3、多工程項目創建 4、添加子工程(基于多工程目錄結構) 5、 .pro文件 1、新建項目 切換到“編輯”界面,點擊菜單欄中的“文件”-“新建文件或項目” 2、單工程項目創建 只有一個工程的項目&#…

Axure RP移動端高保真CRM辦公客戶管理系統原型模板及元件庫

Axure RP移動端高保真CRM辦公客戶管理系統原型模板及元件庫,一套典型的移動端辦公工具型APP Axure RP原型模板,可根據實際的產品需求進行擴展,也可以作為移動端原型設計的參考案例。為提升本作品參考價值,在模板設計過程中盡量追求…

chatGPT應用于房地產行業

作為 2023 年的房地產專業人士,您無疑認識到技術對行業的重大影響。近年來,一項技術進步席卷了世界——人工智能。人工智能徹底改變了房地產業務的各個方面,從簡化管理任務到增強客戶互動。 在本文中,我們將探討幾種巧妙的人工智…

HTML 語言簡介

1.概述 HTML 是網頁使用的語言,定義了網頁的結構和內容。瀏覽器訪問網站,其實就是從服務器下載 HTML 代碼,然后渲染出網頁。 HTML 的全名是“超文本標記語言”(HyperText Markup Language),上個世紀90年代…

zabbix自動注冊服務器以及部署代理服務器

文章目錄 Zabbix自動注冊服務器及部署代理服務器一.zabbix自動注冊1.什么是自動注冊2.環境準備3.zabbix客戶端配置4.在 Web 頁面配置自動注冊5.驗證自動注冊 二.部署 zabbix 代理服務器1.分布式監控的作用:2.環境部署3.代理服務器配置4.客戶端配置5.web頁面配置5.1 …

MS9940T 國產 模擬前端AFE芯片 11-15 節鋰電池或磷酸鹽電池管理芯片 替代BQ76940

產品簡述 MS9940T 是模擬前端 (AFE) 芯片,支持11 到 15 組電池串聯。通過 I 2 C ,主機控制器 可以使用 MS9940T 來實現電池組管理功能,例如監控(電池電壓、電池組電流、電池組 溫度)、保護(控制…

分類預測 | MATLAB實現GWO-BiLSTM-Attention多輸入分類預測

分類預測 | MATLAB實現GWO-BiLSTM-Attention多輸入分類預測 目錄 分類預測 | MATLAB實現GWO-BiLSTM-Attention多輸入分類預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.GWO-BiLSTM-Attention 數據分類預測程序 2.代碼說明:基于灰狼優化算法&#xff08…

vuejs 設計與實現 - 組件的實現原理

1.渲染組件 如果是組件則:vnode .type的值是一個對象。如下: const vnode {type: MyComponent,}為了讓渲染器能處理組件類型的虛擬節點,我們還需要在patch函數中對組件類型的虛擬節點進行處理,如下: function patc…

CentOS7.9 禁用22端口,使用其他端口替代

文章目錄 業務場景操作步驟修改sshd配置文件修改SELinux開放給ssh使用的端口修改防火墻,開放新端口重啟sshd生效 相關知識點介紹sshd服務SELinux服務firewall.service服務 業務場景 我們在某市實施交通信控平臺項目,我們申請了一臺服務器,用…

學習Vue:列表渲染(v-for)

在 Vue.js 中,實現動態列表的顯示是非常常見的需求。為了達到這個目的,Vue 提供了 v-for 指令,它允許您迭代一個數組或對象,將其元素渲染為列表。然而,在使用 v-for 時,key 屬性的設置也非常重要&#xff0…

微信小程序(原生)搜索功能實現

一、效果圖 二、代碼 wxml <van-searchvalue"{{ keyword }}"shape"round"background"#000"placeholder"請輸入關鍵詞"use-action-slotbind:change"onChange"bind:search"onSearch"bind:clear"onClear&q…

實踐-CNN卷積層

實踐-CNN卷積層 1 卷積層構造2 整體流程3 BatchNormalization效果4 參數對比5 測試效果 1 卷積層構造 2 整體流程 根據網絡結構來寫就可以了。 池化 拉平 訓練一個網絡需要2-3天的時間。用經典網絡來&#xff0c;一些細節沒有必要去扣。 損失函數&#xff1a; fit模型&…

運維監控學習筆記1

1、監控對象&#xff1a; 1、監控對象的理解&#xff1b;CPU是怎么工作的&#xff1b; 2、監控對象的指標&#xff1a;CPU使用率&#xff1b;上下文切換&#xff1b; 3、確定性能基準線&#xff1a;CPU負載多少才算高&#xff1b; 2、監控范圍&#xff1a; 1、硬件監控&#x…

線性掃描寄存器分配算法介紹

線性掃描寄存器分配 文章目錄 線性掃描寄存器分配1. 算法介紹2. 相關概念3. 算法的實現3.1 偽代碼3.2 圖示 參考文獻 論文地址&#xff1a; Linear Scan Register Allocation ? 我們描述了一種稱為線性掃描的快速全局寄存器分配的新算法。該算法不基于圖形著色&#xff0c;而…

echarts3d柱狀圖

//畫立方體三個面 const CubeLeft echarts.graphic.extendShape({shape: {x: 0,y: 0,width: 9.5, //柱狀圖寬zWidth: 4, //陰影折角寬zHeight: 3, //陰影折角高},buildPath: function (ctx, shape) {const api shape.api;const xAxisPoint api.coord([shape.xValue, 0]);con…

陪診小程序開發|陪診陪護小程序讓看病不再難

陪診小程序通過與醫療機構的合作&#xff0c;整合了醫療資源&#xff0c;讓用戶能夠更加方便地獲得專業醫療服務。用戶不再需要面對繁瑣的掛號排隊&#xff0c;只需通過小程序預約服務&#xff0c;便能夠享受到合適的醫療資源。這使得用戶的就醫過程變得簡單高效&#xff0c;并…

Redis使用規范及優化

緩存設計 緩存方案 普通緩存 查詢數據時&#xff0c;先查找緩存&#xff0c;如果有延長緩存時間并返回。如果沒有&#xff0c;再去查找數據庫&#xff0c;將查詢的數據再寫到緩存&#xff0c;同時設置過期時間。如果是靜態熱點數據&#xff0c;可以不設置緩存失效時間。 冷…

IntelliJ最佳插件

基于 IntelliJ 平臺的 JetBrains IDE 可能是當今最常見的 IDE 之一。它們的受歡迎程度在 JVM 語言社區中尤其明顯&#xff0c;IntelliJ IDEA 仍然是大多數開發人員的首選 IDE。所有這一切都是在一些新競爭對手的出現和老競爭對手克服以前的缺點并重新加入競爭者的情況下實現的。…

【EI/SCOPUS檢索】第三屆計算機視覺、應用與算法國際學術會議(CVAA 2023)

第三屆計算機視覺、應用與算法國際學術會議&#xff08;CVAA 2023) The 3rd International Conference on Computer Vision, Application and Algorithm 2023年第三屆計算機視覺、應用與算法國際學術會議&#xff08;CVAA 2023&#xff09;主要圍繞計算機視覺、計算機應用、計…