IOC控制反轉

IOC

????????IOC,全稱為Inversion of Control(控制反轉),是一種設計原則,它反轉了傳統編程中的控制流程。在傳統的編程模式中,組件之間的依賴關系是由組件自身在內部創建和維護的。而在控制反轉模式中,這種依賴關系由外部容器(如Spring框架)來管理,組件不再負責自己的依賴,而是通過外部容器來注入所需的依賴。

控制反轉的概念

????????控制反轉的核心思想是將對象的創建和它們之間的依賴關系管理從對象本身轉移到外部容器。這樣做的好處是:

  1. 降低耦合度:組件之間的依賴關系不再是硬編碼的,因此可以更容易地更換組件實現,提高系統的靈活性和可維護性。
  2. 提高模塊化:各個組件可以獨立開發和測試,因為它們不依賴于具體的實現,而是依賴于抽象的接口或抽象類。
  3. 便于測試:由于組件之間的依賴被外部化,可以更容易地使用mock對象或測試樁來模擬依賴進行單元測試。

控制反轉的實現方式

????????控制反轉可以通過以下幾種方式實現:

  1. 依賴注入:這是最常見的實現方式,容器在運行時將組件所需的依賴注入到組件中。
  2. 服務定位器模式:組件不直接創建依賴,而是通過一個服務定位器來查詢依賴對象。服務定位器負責管理依賴對象的創建和生命周期。
  3. 工廠模式:通過工廠類來創建對象,而不是直接在組件中創建。工廠類負責對象的創建和依賴關系的管理。

Spring框架中的IOC容器

????????Spring框架是一個實現了控制反轉原則的輕量級容器,它提供了一個中央容器來管理所有組件的創建、配置和依賴關系。Spring的IOC容器主要通過以下幾個步驟來實現控制反轉:

  1. 配置元數據:通過XML配置文件、注解或Java配置類來定義組件的元數據。
  2. 容器啟動:Spring容器啟動時,會讀取配置元數據,并根據這些信息創建和配置組件。
  3. 依賴注入:容器根據配置的依賴關系,通過構造器注入、Setter注入等方式,將依賴注入到組件中。
  4. 應用上下文:Spring容器充當應用上下文的角色,管理所有組件的生命周期和依賴關系。
  5. 懶加載和預加載:Spring容器可以配置為懶加載(按需加載)或預加載(啟動時加載)組件。

優點和缺點如下:

????????優點:

  1. 解耦:組件之間的耦合度降低,提高了模塊化。
  2. 可維護性:組件更容易替換和維護
  3. 可測試性:依賴可以被mock或替換,便于單元測試。
  4. 靈活性:可以靈活地配置和擴展系統

????????缺點:

  1. 復雜性:引入了額外的容器和配置,增加了系統的復雜性。
  2. 性能開銷:可能會有輕微的性能開銷,尤其是在容器啟動和依賴注入時
  3. 過度設計:在一些簡單的項目中,控制反轉可能被視為不必要的復雜性。

IOC實踐

????????控制反轉(IOC)的一個典型例子是在Spring框架中使用依賴注入(DI)來管理對象的生命周期和依賴關系。下面我將通過一個簡單的例子來展示IOC的使用,并在博客當中提供相應的代碼。

????????假設我們有一個簡單的日志服務,它依賴于一個日志記錄器。在傳統的編程模式中,日志服務可能會自己創建日志記錄器的實例。使用Spring的IOC,我們可以將日志記錄器的創建和管理交給Spring容器。

代碼結構與Spring應用上下文如下:

日志記錄器接口和實現

public interface Logger {void log(String message);
}public class ConsoleLogger implements Logger {@Overridepublic void log(String message) {System.out.println("Logging to console: " + message);}
}

需要日志服務的業務組件

public class BusinessService {private Logger logger;// 通過構造器注入public BusinessService(Logger logger) {this.logger = logger;}public void doBusiness() {logger.log("Business operation performed.");// 執行業務邏輯}
}

配置Spring容器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic Logger logger() {return new ConsoleLogger();}@Beanpublic BusinessService businessService(Logger logger) {return new BusinessService(logger);}
}

啟動Spring應用上下文并使用業務組件

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Application {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);BusinessService businessService = context.getBean(BusinessService.class);businessService.doBusiness();}
}

BusinessService 需要一個 Logger 來記錄日志。通過Spring的IOC容器,我們不需要在 BusinessService 中創建 Logger 的實例,而是通過配置類 AppConfig 來告訴Spring如何創建這些Bean,以及它們之間的依賴關系。當 Application 類啟動時,它創建了一個Spring應用上下文,從中獲取 BusinessService 的實例,并調用它的 doBusiness 方法。Spring容器負責注入Logger 的實例到 BusinessService 中,這樣就實現了控制反轉。

結論

????????控制反轉是一種重要的設計原則,它通過將控制權從組件轉移到外部容器,提高了系統的靈活性和可維護性。Spring框架是實現控制反轉的典型例子,它提供了一個強大的I0C容器來管理組件的生命周期和依賴關系。通過使用Spring,開發者可以構建松耦合、易于測試和維護的應用程序。

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

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

相關文章

SSH 免密登錄vscode 附debug 免密登錄失敗問題排查

SSH 免密登錄vscode 附debug 關鍵詞 :vscode ssh ssh無法免密登錄 ssh免密登錄失敗 1 sshd 的配置文件/etc/ssh/sshd_config, 確保公鑰登錄開啟 PubkeyAuthentication yes2 生成公鑰并上傳 ssh-keygen找到本地 .ssh/id_rsa.pub 將其中文本內容搞到…

PS —— 制作證件照

PS —— 制作證件照 裁剪工具魔棒工具油漆桶工具擴展畫布 老是看編程,會有些疲勞,這個專欄我會放一些其他的知識,我們今天利用PS制作證件照(注意,這里一些ps的基礎操作我不會很展開的去講): 裁…

Redisson分布式Redis鎖,tryLock方法詳解

在 Java 中,RLock 是 Redisson 庫中提供的一個分布式鎖接口,用于實現基于 Redis 的分布式鎖。RLock 的 tryLock 方法用于嘗試獲取鎖,并在特定的時間內等待獲取鎖。 方法簽名如下: boolean tryLock(long waitTime, long leaseTim…

WPF關鍵組件代碼示例

通過一個綜合示例代碼,展示WPF的關鍵組件,包括XAML、控件、數據綁定、樣式和模板以及動畫。這個示例創建一個簡單的WPF應用程序,包含一個文本框、按鈕和列表框,實現數據綁定、自定義樣式和模板,以及按鈕點擊后的動畫效…

深入解析R語言的貝葉斯網絡模型:構建、優化與預測;INLA下的貝葉斯回歸;現代貝葉斯統計學方法;R語言混合效應(多水平/層次/嵌套)

目錄 ①基于R語言的貝葉斯網絡模型的實踐應用 ②R語言貝葉斯方法在生態環境領域中的應用 ③基于R語言貝葉斯進階:INLA下的貝葉斯回歸、生存分析、隨機游走、廣義可加模型、極端數據的貝葉斯分析 ④基于R語言的現代貝葉斯統計學方法(貝葉斯參數估計、貝葉斯回歸、…

react使用AntV

AntV使用(https://antv.antgroup.com/) import React, { useEffect } from "react"; // npm install antv/g2 import { Chart } from "antv/g2"; const Charts () > { function Ccc() { // 準備數據 const data [ { genre: …

【Linux】腳本shell script

shell是與Linux交互的基本工具 shell script是針對shell所寫的腳本,解釋執行,無需編譯 注意事項 指令的執行是從上而下、從左而右的分析與執行; 指令、選項與參數間的多個空白都會被忽略掉; 空白行也將被忽略掉,并且…

抽象工廠模式(AbstractFactoryPattern)

文章目錄 1.抽象工廠模式定義2.UML類圖3.抽象工廠模式具體實現工廠模式實現單一產品族抽象工廠實現多產品族產品類工廠類使用 4.抽象工廠模式優缺點 1.抽象工廠模式定義 提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。 工廠方法模式是單一產…

2024電工杯B題食譜評價與優化模型思路代碼論文分析

2024年電工杯數學建模競賽B題論文和代碼已完成,代碼為B題全部問題的代碼,論文包括摘要、問題重述、問題分析、模型假設、符號說明、模型的建立和求解(問題1模型的建立和求解、問題2模型的建立和求解、問題3模型的建立和求解)、模型…

正點原子[第二期]Linux之ARM(MX6U)裸機篇學習筆記-17講 定時器按鍵消抖

前言: 本文是根據嗶哩嗶哩網站上“正點原子[第二期]Linux之ARM(MX6U)裸機篇”視頻的學習筆記,在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。…

計算機網絡安全控制技術

1.防火墻技術 防火墻技術是近年來維護網絡安全最重要的手段,但是防火墻不是萬能的,需要配合其他安全措施來協同 2.加密技術 目前加密技術主要有兩大類:對稱加密和非對稱加密 3.用戶識別技術 核心是識別網絡者是否是屬于系統的合法用戶 …

【設計模式深度剖析】【1】【結構型】【代理模式】| 玩游戲打怪、升級為例加深理解

👈?上一篇:創建型設計模式對比 | 下一篇:裝飾器模式👉? 目 錄 代理模式定義英文原話直譯如何理解? 3個角色UML類圖1. 抽象主題(Subject)角色2. 代理類:代理主題(Proxy Subject&#xff0…

UE5 OnlineSubsystem Steam創建會話失敗解決方法

連接上Steam但是創建會話失敗 解決方法 在DefaultEngine.ini中加上bInitServerOnClienttrue,這個其實在官方文檔里用注釋給出了,直接取消注釋就行 刪除項目目錄中的Saved、Internmediate、Binaries目錄 右鍵你的項目.uproject選擇Generate Visual Studio project f…

ASP.Net MVC在控制臺添加視圖時沒有模型類并且不能添加視圖

情況如下: 解決方法: 1.查看vs能否創建asp.net mvc項目,這種情況一般是更換了vs打開老項目 2.點擊跳轉至修改安裝選項界面 3.選擇安裝項即可 如果以上都有: 看看你的視圖文件是否存在在項目中 也不能點擊添加,如果…

探索數值分析的奧秘:掌握NumPy與Pandas基礎

新書上架~👇全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目錄 一、NumPy:數值計算的效率提升器 二、Pandas:數據處理與分析的利器 …

Linux文本三劍客之sed

set的定義: sed是一種流編輯器,流編輯器會在編輯器處理數據之前基于預先提供的一組規則來編輯數據流。 sed編輯器可以根據命令來處理數據流中的數據,這些命令要么從命令行中輸入,要么存儲在一個命令文本文件中。 sed的執行過程&a…

Nextjs 動態路由獲取參數

目錄 一、創建page目錄下的路由文件 二、通過useRouter來獲取動態參數 先看官方文檔:Routing: Dynamic Routes | Next.js 使用Nextjs13版本參考官方文檔后實現仍有問題,網上的材料大多和官網一致,經過測試后,我找到了這個解決方…

【日記】今天好困(407 字)

正文 4T 硬盤降價了,好心動。雖然只降了 10 塊錢……. 為什么硬盤這么貴啊!哼。 柜面上雜事好多。雖然一天到晚見不到幾個客戶,但雜事就是很多。一個頭兩個大。也不知道從哪兒冒出來的這么多事。 芒果干到了!還沒去取,…

sql把一個表的某幾列的數據存到另一個表里

一.如何用slq語句把一個表中的某幾個字段的數據插入到另一個新表中,就要用下面這條slq語句: insert into 表名1(字段1,字段2) select 字段1,字段2 from 表名2 這里有一點值得注意的是這2個字段要一一對應,并且按順序。 二.如果另一個表是…

JAVASE之類和對象(1)

路雖遠,行則將至;事雖難,做則必成。 主頁:趨早——Step 專欄:JAVASE gitte:https://gitee.com/good-thg 引言: 這篇文章我們只介紹前半部分,下一篇文章會介紹剩下的部分。 目錄 一、…