javascript
后端:Spring IOC 知识点总结,写得太好了!
來(lái)自:潘佳琪?|?責(zé)編:樂(lè)樂(lè)
鏈接:segmentfault.com/a/1190000022015914
廣義的 IOC
在這之前,我們先記住一句話(huà)。好萊塢原則:Don’t call me, we will call you. 即“不用打電話(huà)過(guò)來(lái),我們會(huì)打給你”。
控制反轉(zhuǎn)(Inversion of Control,簡(jiǎn)稱(chēng) IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則,可以用來(lái)減低計(jì)算機(jī)代碼之間的耦合度。其中最常見(jiàn)的方式叫做依賴(lài)注入(Dependency Injection,簡(jiǎn)稱(chēng) DI),還有一種方式叫“依賴(lài)查找”(Dependency Lookup)。通過(guò)控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體,將其所依賴(lài)的對(duì)象的引用傳遞(注入)給它。
兩種實(shí)現(xiàn):依賴(lài)查找(DL)和依賴(lài)注入(DI)。
IOC 和 DI 、DL 的關(guān)系:
DI(Dependency Injection)是 Spring 使用的方式,容器負(fù)責(zé)組件的裝配。
DL(Dependency Lookup)已經(jīng)被拋棄。
IOC 容器的原理
IOC 容器其實(shí)就是一個(gè)大工廠,它用來(lái)管理我們所有的對(duì)象以及依賴(lài)關(guān)系。
原理就是通過(guò) Java 的反射技術(shù)來(lái)實(shí)現(xiàn)的!通過(guò)反射我們可以獲取類(lèi)的所有信息(成員變量、類(lèi)名等等等)!
再通過(guò)配置文件(xml)或者注解來(lái)描述類(lèi)與類(lèi)之間的關(guān)系
我們就可以通過(guò)這些配置信息和反射技術(shù)來(lái)構(gòu)建出對(duì)應(yīng)的對(duì)象和依賴(lài)關(guān)系了!
我們簡(jiǎn)單來(lái)看看實(shí)際 Spring IOC 容器是怎么實(shí)現(xiàn)對(duì)象的創(chuàng)建和依賴(lài)的:
1. 根據(jù) Bean 配置信息在容器內(nèi)部創(chuàng)建 Bean 定義注冊(cè)表
2. 根據(jù)注冊(cè)表加載、實(shí)例化 bean、建立 Bean 與 Bean 之間的依賴(lài)關(guān)系
3. 將這些準(zhǔn)備就緒的 Bean 放到 Map 緩存池中,等待應(yīng)用程序調(diào)用
Spring 容器(Bean 工廠)可簡(jiǎn)單分成兩種:
BeanFactory
這是最基礎(chǔ)、面向 Spring 的
ApplicationContext
ApplicationContext 是 BeanFactory 的子類(lèi)
沒(méi)有特殊要求的情況下,應(yīng)該使用 ApplicationContext 完成。
因?yàn)?BeanFactory 能完成的事情,ApplicationContext 都能完成,并且提供了更多接近現(xiàn)在開(kāi)發(fā)的功能。
對(duì) IOC 的理解
首先,IOC 控制反轉(zhuǎn)
誰(shuí)控制誰(shuí),控制什么,什么是反轉(zhuǎn)(有反轉(zhuǎn)就應(yīng)該有正轉(zhuǎn)了)
誰(shuí)控制誰(shuí),控制什么:
在之前,沒(méi)有 IOC 時(shí),我們直接在對(duì)象內(nèi)部通過(guò) new 進(jìn)行創(chuàng)建對(duì)象,是程序主動(dòng)去創(chuàng)建依賴(lài)對(duì)象;
而現(xiàn)在,是由 IOC 專(zhuān)門(mén)一個(gè)容器來(lái)創(chuàng)建這些對(duì)象,即由 Ioc 容器來(lái)控制對(duì) 象的創(chuàng)建;
誰(shuí)控制誰(shuí)?當(dāng)然是 IOC 容器控制了對(duì)象;控制什么?那就是主要控制了外部資源獲取(不只是對(duì)象還包括比如文件等)。
所謂反轉(zhuǎn):
有反轉(zhuǎn)就應(yīng)該有正轉(zhuǎn),傳統(tǒng)應(yīng)用程序是由我們自己在對(duì)象中主動(dòng)控制去直接獲取依賴(lài)對(duì)象,也就是正轉(zhuǎn);
而所謂的反轉(zhuǎn),其實(shí)是反轉(zhuǎn)的控制權(quán),由 Spring 來(lái)控制對(duì)象的生命周期,那么對(duì)象的控制就完全脫離了我們的控制,控制權(quán)交給了 Spring 。這個(gè)反轉(zhuǎn)是指:我們由對(duì)象的控制者變成了 IOC 的被動(dòng)控制者。
其次,說(shuō)到 IOC 就會(huì)想到 DI 依賴(lài)注入(IOC 是通過(guò) DI 來(lái)實(shí)現(xiàn)的),那么:
誰(shuí)依賴(lài)誰(shuí):A 對(duì)象 依賴(lài)于 IOC 容器。
為什么需要依賴(lài):A 對(duì)象需要 IOC 容器提供對(duì)象需要的數(shù)據(jù)、B 對(duì)象等外部資源,沒(méi)有這些資源不能完成業(yè)務(wù)處理。
誰(shuí)注入誰(shuí):IOC 容器注入 A 對(duì)象。
注入了什么:IOC 容器將 A 對(duì)象 需要的數(shù)據(jù)、B 對(duì)象等外
部資源按需注入給對(duì)象。
好處:降低了開(kāi)發(fā)的成本,提高了代碼復(fù)用率、軟件的靈活性。
總結(jié)
IOC:不是什么技術(shù),而是一種設(shè)計(jì)思想。在 Spring 開(kāi)發(fā)中,由 IOC 容器控制對(duì)象的創(chuàng)建、初始化、銷(xiāo)毀等。
這也就實(shí)現(xiàn)了對(duì)象控制權(quán)的反轉(zhuǎn),由我們對(duì)對(duì)象的控制轉(zhuǎn)變成了Spring IOC 對(duì)對(duì)象的控制。
DI:是 IOC 的具體實(shí)現(xiàn)。程序把依賴(lài)交給容器,容器幫你管理依賴(lài)。
文章推薦程序員效率:畫(huà)流程圖常用的工具程序員效率:整理常用的在線(xiàn)筆記軟件遠(yuǎn)程辦公:常用的遠(yuǎn)程協(xié)助軟件,你都知道嗎?51單片機(jī)程序下載、ISP及串口基礎(chǔ)知識(shí)硬件:斷路器、接觸器、繼電器基礎(chǔ)知識(shí)
總結(jié)
以上是生活随笔為你收集整理的后端:Spring IOC 知识点总结,写得太好了!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 神经网络中的 Dropout 以及变体方
- 下一篇: 视频格式介绍