簡單解釋什么是 依賴注入 和 控制反轉

簡單解釋什么是 依賴注入 和 控制反轉
2017-07-09

關于 依賴注入 與 控制反轉 的概念有些人覺得很難理解,最近在給別人講這個概念的時候梳理了一個比較好理解的解釋,而且我認為非技術人員也應該能聽的懂,因此分享給大家,希望下次你在給別人講的時候也能講的明白。

其實 依賴注入 和 控制反轉 說的是同一件事情,只是站的角度不同而已。

我們就拿超人和小怪獸的事情來做類比對象。

地球受到了威脅,不斷有小怪獸來想要破壞地球,每來一個小怪獸我們就需要找一個超人去對付他,一個超人肯定是不夠的,因為每次來到小怪獸都是不一樣的,他們所具有的能力也是不一樣的。

因此我們必須找到合適的超人去對付他,最壞的情況是每來一個小怪獸我們就要找一個或者制造一個新超人,那么來十個小怪獸,我們就要制造十個,來百個就要制造百個,來千,來萬,來億我們就要制造相應的超人,而大部分超人只能用一次。

為了解決這個問題我們引入依賴注入和控制反轉的概念,我們將超人和超能力分開,獨立的超人和獨立的超能力,當一個小怪獸來的時候我們找到超人,將相應的超能力給予他,讓他去消滅小怪獸。

這樣的話我們只需要幾個超人就好了,我們不再需要制造超人,而是研究如何制造更多更好的超能力給超人使用。

超能力和超人不再是強依賴關系。超能力是由外部給予超人的,超人和超能力有依賴,但是這個依賴是外部給予,因此我們可以說超能力是由外部注入給他的,所以這就叫 依賴注入。

而反過來說,超人具有何種超能力不是他內部自身控制的,而是由外部控制的,相當于將超能力具有何種功效交給了外部,外部來決定超人該有的超能力,所以超能力的控制權被由自身控制反轉為外部控制,這被稱為 控制反轉。

這就是關于 依賴注入 和 控制反轉 的我的比較好理解的解釋。它能較好的解決對象與對象之間的強耦合問題,同時也能做的按需使用按需加載。

順便說一下,鋼鐵俠和蝙蝠俠更受歡迎的原因我認為就是因為他們的超能力是外部給予的,而非自身的,因此可以不斷有新的超能力給他們使用,因此也更有看點和新鮮感。

原文轉載自簡單解釋什么是 依賴注入 和 控制反轉

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

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

相關文章

python pip install指定國內源鏡像

有時候安裝一些依賴包,網不好,直接超時,或者這個包就是死都下不下來的時候,可以指定國內源鏡像。 pip install -i 國內鏡像地址 包名 清華:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirr…

機器學習之單標簽多分類及多標簽多分類

單標簽二分類算法 Logistic算法 單標簽多分類算法 Softmax算法 One-Versus-One(ovo):一對一 One-Versus-All / One-Versus-the-Rest(ova/ovr): 一對多 ovo和ovr的區別 Error Correcting Output code…

ionic3 隱藏子頁面tabs

看了幾天ionic3 問題還挺多的,今天想把所有子頁面tabs 給去掉,整了半天,發現app.Module 是可以配置的 修改 IonicModule.forRoot(MyApp) imports: [BrowserModule,// IonicModule.forRoot(MyApp),HttpModule,IonicModule.forRoot(…

cas單點登錄-jdbc認證(三)

前言 本節的內容為JDBC認證,查找數據庫進行驗證,其中包括: 密碼加密策略(無密碼,簡單加密,加鹽處理)認證策略(jdbc)一、業務需求 不同的公司,需求業務需求或者…

get clone 出現 fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 報錯信息

fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 解決方案 (親測有效) 解決方案如下: git clone時加上 --depth1,比如: git clone https://gitee.com/songyitian/tctm.git --depth 1depth用于指定…

mybatis foreach map_重學Mybatis(六)-------輸入映射(含面試題)

博主將會針對Java面試題寫一組文章,包括J2ee,SQL,主流Web框架,中間件等面試過程中面試官經常問的問題,歡迎大家關注。一起學習,一起成長,文章底部有面試題。入參映射關鍵字說明圖中paramenterTy…

php輸出多余的空格或者空行

1&#xff0c;文件是否有bom。可以通過腳步檢測&#xff0c;或者利用notepa打開&#xff0c;查看編碼格式。 2. <?php echo something; ?> 或許是你的php標簽外&#xff0c;有空格或者空行。一般的項目都是用框架&#xff0c;包含很多的文件&#xff0c;如果一個個文…

執行git命令時出現fatal: ‘origin‘ does not appear to be a git repository錯誤

執行git命令時出現fatal: ‘origin’ does not appear to be a git repository錯誤 在執行git pull origin master時出現&#xff1a;   fatal: ‘origin’ does not appear to be a git repository   致命提示:“origin”看起來不是一個git存儲庫   fatal: Could not r…

蔣濤作序盛贊Leo新作為“程序員職場實用百科全書”——《程序員羊皮卷》連載(1)

《程序員羊皮卷》當當購買地址&#xff1a;http://product.dangdang.com/product.aspx?product_id20691986 互動購買地址&#xff1a;http://www.china-pub.com/196049 程序員行業從外面看起來有很多絢麗的光環&#xff0c;這里有無數以程序致富的天才&#xff0c;世界首富比…

matlab ones函數_Matlab中相見恨晚的命令(持續更新)

知乎上有個“有哪些讓人相見恨晚的Matlab命令”的話題&#xff0c;很多答主提供的命令確實很實用&#xff0c;為了更方便大家的學習&#xff0c;我就知乎上的答案和我自己想到的都綜合整理成了一篇文章&#xff0c;把我覺得很實用的指令整理出來。知乎原答案鏈接dbstop if erro…

機器學習之特征工程

特征工程-概念 特征工程是一個面向十分廣的概念&#xff0c;只要是在處理數據就可以認為是在做特征工程。個人理解&#xff0c;真正意義上的特征工程還是數據降維和數據升維的過程。 而前期對數據的處理過程&#xff1a; 需要哪些數據&#xff1f;數據如何存儲&#xff1f;數…

ArcGIS AO開發高亮顯示某些要素

參考代碼1 ifeaturecursor pcur ifeatureclass.search(iqueryfilter pfilter); pfilter.whereclause strAddress; //輸入查詢條件&#xff0c;也就是你寸地址的字段名didian ifeature pfeat pcur.nextfeature();// 如果pCur多個要素&#xff0c;則可以考慮將其合并并一起高亮…

Oracle傳輸表空間介紹

傳輸表空間通過拷貝數據文件的方式&#xff0c;實現可跨平臺的數據遷移&#xff0c;效率遠超expdp/impdp, exp/imp等工具。還可以應用跨平臺&數據庫版本遷移表數據、歸檔歷史數據和實現表空間級時間點數據恢復等場景。轉載于:https://www.cnblogs.com/ilifeilong/p/7712654…

git push到GitHub的時候遇到! [rejected] master -> master (non-fast-forward)的問題

git push到GitHub的時候遇到! [rejected] master -> master (non-fast-forward)的問題 解決方法&#xff1a; 1、git pull origin master --allow-unrelated-histories //把遠程倉庫和本地同步&#xff0c;消除差異 2、重新add和commit相應文件 3、git push origin maste…

程序員考核的五大死因(上)

程序員作為企業開發力量的最核心資產&#xff0c;無疑得到公司從上至下的一致關注。開發是個智力密集型產業&#xff0c;程序開發的特點是&#xff0c;付出相同時間的情況下&#xff0c;兩個開發者之間的產能會相差十幾甚至幾十倍。軟件開發人員向來以“不容易考核、工作不容易…

du -sh 如何找到最大的文件夾_小白必看!手把手教你如何在linux上安裝redis數據庫...

首先我們要清楚redis是什么&#xff1f;redis是一種非關系型數據庫&#xff0c;它與MySQL的這種關系型數據庫不同&#xff0c;MySQL是將數據存儲在磁盤中&#xff0c;而redis是儲存在內存中。一般很多公司都是使用MySQLredis兩種數據存儲方式&#xff0c;這樣可以提高性能&…

Linux刪除特殊字符文件

1.刪除帶“-”的文件名的方法使用-- &#xff08;2個橫杠&#xff09;#touch -- -%F-%T#rm -- -%F-%Trm: remove regular empty file -%F-%T?使用絕對路徑并TAB特殊文件名#rm /root/-%F-%Trm: remove regular empty file /root/-%F-%T?2. 刪除包含其它特殊字符的文件對于含有…

機器學習之線性回歸 損失函數、代價函數、目標函數

損失函數&#xff08;Loss Function&#xff09;定義在單個樣本上&#xff0c;算的是一個樣本的誤差。比如&#xff1a; 其中0-1損失函數: 感知器損失函數&#xff1a; 平方和損失函數&#xff1a; 絕對損失函數&#xff1a; 對數損失函數&#xff1a; 代價函數&#xff08;Cos…

bzoj4950(二分圖最大匹配)

[Wf2017]Mission Improbable Time Limit: 1 Sec Memory Limit: 1024 MBSubmit: 105 Solved: 49[Submit][Status][Discuss]Description 那是春日里一個天氣晴朗的好日子,你準備去見見你的老朋友Patrick,也是你之前的犯罪同伙。Patrick在編程競賽上豪賭輸掉了一大筆錢,所以他需…

git 遠程倉庫管理 分支創建、管理、查看、切換

作用&#xff1a; 區分生產環境代碼以及開發環境代碼研究新的功能或者攻關難題解決線上bug 特點&#xff1a; 項目開發中公用分支包括master、dev分支master是默認分支&#xff0c;用于發布&#xff0c;當需要發布時將dev分支合并到master分支分支dev是用于開發的分支&#…