javascript
Spring IOC 知识点总结,写得太好了!
廣義的 IOC
在這之前,我們先記住一句話。好萊塢原則:Don’t call me, we will call you.?即“不用打電話過來,我們會打給你”。
控制反轉(Inversion of Control,簡稱 IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱 DI),還有一種方式叫“依賴查找”(Dependency Lookup)。
通過控制反轉,對象在被創(chuàng)建的時候,由一個調控系統(tǒng)內所有對象的外界實體,將其所依賴的對象的引用傳遞(注入)給它。
兩種實現(xiàn):依賴查找(DL)和依賴注入(DI)。
IOC 和 DI 、DL 的關系:
-
DI(Dependency Injection)是?Spring?使用的方式,容器負責組件的裝配。
-
DL(Dependency Lookup)已經被拋棄。
IOC 容器的原理
IOC 容器其實就是一個大工廠,它用來管理我們所有的對象以及依賴關系。
-
原理就是通過 Java 的反射技術來實現(xiàn)的!通過反射我們可以獲取類的所有信息(成員變量、類名等等等)!
-
再通過配置文件(xml)或者注解來描述類與類之間的關系
-
我們就可以通過這些配置信息和反射技術來構建出對應的對象和依賴關系了!
我們簡單來看看實際?Spring?IOC 容器是怎么實現(xiàn)對象的創(chuàng)建和依賴的:
1. 根據(jù) Bean 配置信息在容器內部創(chuàng)建 Bean 定義注冊表
2. 根據(jù)注冊表加載、實例化 bean、建立 Bean 與 Bean 之間的依賴關系
3. 將這些準備就緒的 Bean 放到 Map 緩存池中,等待應用程序調用
Spring 容器(Bean 工廠)可簡單分成兩種:
-
BeanFactory
-
這是最基礎、面向 Spring 的
-
ApplicationContext
-
ApplicationContext 是 BeanFactory 的子類
沒有特殊要求的情況下,應該使用 ApplicationContext 完成。
因為 BeanFactory 能完成的事情,ApplicationContext 都能完成,并且提供了更多接近現(xiàn)在開發(fā)的功能。
對 IOC 的理解
首先,IOC 控制反轉
誰控制誰,控制什么,什么是反轉(有反轉就應該有正轉了)
誰控制誰,控制什么:
-
在之前,沒有 IOC 時,我們直接在對象內部通過 new 進行創(chuàng)建對象,是程序主動去創(chuàng)建依賴對象;
-
而現(xiàn)在,是由 IOC 專門一個容器來創(chuàng)建這些對象,即由 Ioc 容器來控制對 象的創(chuàng)建;
-
誰控制誰?當然是 IOC 容器控制了對象;控制什么?那就是主要控制了外部資源獲取(不只是對象還包括比如文件等)。
所謂反轉:
-
有反轉就應該有正轉,傳統(tǒng)應用程序是由我們自己在對象中主動控制去直接獲取依賴對象,也就是正轉;
-
而所謂的反轉,其實是反轉的控制權,由?Spring?來控制對象的生命周期,那么對象的控制就完全脫離了我們的控制,控制權交給了?Spring?。這個反轉是指:我們由對象的控制者變成了 IOC 的被動控制者。
其次,說到 IOC 就會想到 DI 依賴注入(IOC 是通過 DI 來實現(xiàn)的),那么:
-
誰依賴誰:A 對象 依賴于 IOC 容器。
-
為什么需要依賴:A 對象需要 IOC 容器提供對象需要的數(shù)據(jù)、B 對象等外部資源,沒有這些資源不能完成業(yè)務處理。
-
誰注入誰:IOC 容器注入 A 對象。
-
注入了什么:IOC 容器將 A 對象 需要的數(shù)據(jù)、B 對象等外部資源按需注入給對象。
好處:降低了開發(fā)的成本,提高了代碼復用率、軟件的靈活性。
總結
IOC:不是什么技術,而是一種設計思想。在?Spring?開發(fā)中,由 IOC 容器控制對象的創(chuàng)建、初始化、銷毀等。這也就實現(xiàn)了對象控制權的反轉,由我們對對象的控制轉變成了Spring?IOC 對對象的控制。
DI:是 IOC 的具體實現(xiàn)。程序把依賴交給容器,容器幫你管理依賴。
作者:潘佳琪
https://segmentfault.com/a/1190000022015914
總結
以上是生活随笔為你收集整理的Spring IOC 知识点总结,写得太好了!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring-boot:run 是怎么运
- 下一篇: 带着问题学 Kubernetes 架构!