當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
抛开 Spring 去理解 IOC 思想:原来 IOC 容器这么简单
生活随笔
收集整理的這篇文章主要介紹了
抛开 Spring 去理解 IOC 思想:原来 IOC 容器这么简单
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
- 很多小伙伴們看到標題可能就會想到拋開 Spring 就不會存在 IOC 思想了,其實不然在接下來的文章中就會講述到。
- 很多小伙伴在理解 IOC 的時候通常會和 Spring 放到一起去學習,首先呢 Spring 設計的非常之巧妙而且里面包含了很多除去 IOC 的其他功能。這樣會導致我們在 Spring 的基礎去理解 IOC 就變得很困難。很難抓住其核心思想。
- 所以本文的標題的含義就是單純的去理解 IOC 思想,然后通過自定義的 IOC 去加深對 IOC 的理解。
- 看完本文之后再去理解 Spring 中的 IOC 其實思想是一致的,只是實現(xiàn)上有些出入。畢竟 Spring 是大神們經(jīng)過深思熟慮后的成果。
傳統(tǒng)的思想(沒有 IOC 容器的情況下)
在沒有 IOC 容器的情況下,如果我們需要某個類具體的操作如下所示:
傳統(tǒng)的 Bean 創(chuàng)建
優(yōu)點
- 很直接的一個優(yōu)點就是簡單,我們需要什么就去創(chuàng)建什么,在程序員的角度上也是比較直觀容易理解的。
缺點
- Bean 之間的協(xié)調(diào)關系是由程序內(nèi)部代碼來控制的即通過 New 關鍵字與我們的業(yè)務代碼進行了強耦合。
- 沒有對 Bean 進行管理。
- 對 Bean 沒有進行統(tǒng)一的管理和配置。
IOC 思想
首先在這里強調(diào)一下 IOC 不是 Spring 提出來了,在 Spring 之前就已經(jīng)有人提出了 IOC 思想,只不過在 Spring 之前都是偏理論化沒有一個具體的落地方案,Spring 在技術層面把 IOC 思想體現(xiàn)的淋漓盡致。
什么是 IOC(Inversion of controller)
- IOC 是一種思想,而不是一個技術的實現(xiàn)。
- 主要的描述是在軟件開發(fā)的領域?qū)ο蟮膭?chuàng)建和管理的問題。
- 上述我們了解了傳統(tǒng)的開發(fā)模式,我們再來看看如果有 IOC 的思想下程序員是如何使用對象的。
從上圖可知:
- 程序員只需要告訴 IOC 自己需要那個 Bean。就不需要關系該 Bean 創(chuàng)建的細節(jié)已經(jīng)該 Bean 的相關依賴。這一切 IOC 容器已經(jīng)幫你做好了。
- 凡事有得必有失: 這個過程中我們失去了創(chuàng)建 Bean 的權利。
- 了解了基本的使用后,有人說 IOC 就是控制反轉(zhuǎn),講到這里你還沒將控制反轉(zhuǎn)?好!別急接下來就是細講我們常說的控制反轉(zhuǎn)。
控制反轉(zhuǎn)
在理解控制反轉(zhuǎn)之前我們首先要清楚控制是指什么? 反轉(zhuǎn)又反轉(zhuǎn)了什么?
- 控制: 指的就是我們上述說的我們失去的權利(創(chuàng)建對象的創(chuàng)建,或者說控制對象的權利)
- 反轉(zhuǎn): 指的是控制權的轉(zhuǎn)變。在沒有 IOC 的容器上我們程序員想創(chuàng)建誰就創(chuàng)建誰的權利。在 IOC 容器下程序員就只能委屈巴巴的向 IOC 容器索取對象。創(chuàng)建對象的權利由程序員到 IOC 容器手里了。
IOC 解決了什么問題?
- 其實就是解決了對象之間的耦合問題。
- 我們不需要在通過 New 關鍵字來創(chuàng)建對象,而是從容器中獲取達到一種松耦合的目的。
- 同時 IOC 容器也方便管理容器內(nèi)的所有 Bean 對象。所謂的 Bean 的生命周期。
IOC 和 DI 的區(qū)別
將到 IOC 肯定會有人想到 DI(Dependancy Injection)依賴注入,那這兩者有什么不同和相同呢?
相同點
- IOC 和 DI 描述的都是同一件事情(對象的實例化以及維護對象與對象已經(jīng)的依賴關系)
不同點
- 首先 IOC 是一種思想,而 DI 是一種具體的技術實現(xiàn)手段。
- IOC 是站著對象的角度上對象的實例化以及管理從程序員的手里交給了 IOC 容器
- DI 是站著容器的角度的上會把對象的依賴的其他對象注入到容器中,上述案例中的 A 類依賴 B 類 IOC 容器不僅僅將 A 類放到容器中還需要將其依賴的 B 類也一并加載到 IOC 容器中。
如何自定義實現(xiàn)一個 IOC 容器
- 小伙伴們看到這里其實對 IOC 容器已經(jīng)有了一定的了解。那如果在面試的過程中面試官問你如何實現(xiàn)一個自定義的 IOC 容器。你可以講出的具體思路嘛? 可以先想一想在繼續(xù)往下看,看看是不是和自己的想法不謀而合。
- 思路大致如下所示:
- 想必大家都有自己的一定的理解,可能做法比較簡單,但是對于理解 IOC 容器而已其實已經(jīng)足夠了。如果想更加準確或者深入了解其底層實現(xiàn),可以按照這個思路去看 Spring 的相關源碼實現(xiàn),相信你一定會得心應手。
小案例
- 我們通過一個小案例來寫我們的 IOC 容器
- 我們經(jīng)常購物,我們可以把購物簡單的理解成下單和減庫存兩個操作。
- 有同學會問為什么要寫這個案例啊,不僅為了我們能夠理解 IOC 容器也為了我們后續(xù)的文章將 AOP 和 AOP 的經(jīng)典實現(xiàn)事務控制鋪墊的。
Coding
- 首先整體的代碼結構很簡單,在這里也說明一下
- Bean 的配置文件
- 創(chuàng)建 Bean 對象”工廠“進行創(chuàng)建
- 主要就是讀取 xml,通過 set 方法傳值。
- 業(yè)務代碼
- 啟動
- 測試 地址: http://localhost:9080/order?userId=857&name=ipone
配圖:
作者:后端學長
鏈接:https://juejin.im/post/5eb022e7f265da7bb46bcd9d
總結
以上是生活随笔為你收集整理的抛开 Spring 去理解 IOC 思想:原来 IOC 容器这么简单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当Tomcat遇上Netty,我这一系列
- 下一篇: 当你收到面试通知后,如下的准备可以大大提