從字面來理解是兩個(gè)概念,IOC 和容器。
容器:
IOC容器屬于 Spring core 模塊,是用來創(chuàng)建和管理 Bean 的地方,以單例的方式存儲(chǔ) Bean,具體存儲(chǔ)的地方:
DefaultListableBeanFactory 的 beanDefinitionMap
以ConcurentHashMap 的形式存儲(chǔ)了 BeanDefinition 對(duì)象,該對(duì)象封裝了 Spring 對(duì) 一個(gè)Bean 所有信息的定義,包括 類名,屬性,構(gòu)造方法參數(shù),依賴,是否延遲加載,是否單例等,之后對(duì) Bean 的操作都是直接對(duì)它進(jìn)行的。
IOC容器的初始化分三個(gè)步驟:
- BeanDefinition 的資源定位
- BeanDefinition 的資源的載入和解析
- BeanDefinition 的注冊(cè)
我們經(jīng)常從 BeanFactory 實(shí)例化 Bean 開始說 Bean的生命周期,而 BeanFactory 就是在第二個(gè)步驟被構(gòu)造出來的。
IOC:
Inversion of Control,控制反轉(zhuǎn)。
我們依舊從字面來理解,控制和反轉(zhuǎn)。
一般我們需要一個(gè)對(duì)象的時(shí)候,都是直接通過 new 的方式創(chuàng)建,這個(gè)時(shí)機(jī)是由我們把握的。也就是說我們什么時(shí)候想要這個(gè)資源,我們就主動(dòng)拿,這個(gè)控制權(quán)在我們手上?,F(xiàn)在這個(gè)控制權(quán)交給 IOC容器了,我們通過聲明的方式表達(dá)我們想要的想法,但這個(gè)資源的創(chuàng)建和發(fā)放,都是 IOC容器控制的。
反轉(zhuǎn)的概念在哪呢,Spring 框架,說到底也只不過是個(gè)工具,編譯后也是以第三方包的形式存在代碼中,以前都是我們使用工具包直接獲取資源,現(xiàn)在反轉(zhuǎn)了,我們能不能獲取這個(gè)資源工具包說了算。
DI:
Dependency Injection,依賴注入,我們依賴 IOC容器注入資源(對(duì)象)。
DI 是 IOC容器實(shí)現(xiàn)控制反轉(zhuǎn)的方式,有三種,這里就不詳述了。
DI 是如何實(shí)現(xiàn)解耦的?
開發(fā)中,我們經(jīng)常在 控制層 調(diào)用 業(yè)務(wù)層 接口,沒有實(shí)現(xiàn)具體類,通過接口對(duì)象直接調(diào)業(yè)務(wù)方法。但是運(yùn)行時(shí)的時(shí)候,IOC容器就動(dòng)態(tài)調(diào)用了對(duì)應(yīng)實(shí)現(xiàn)類的方法。我們只需要通過 @Autowired 注入業(yè)務(wù)的最上層接口,只關(guān)心使用,不用關(guān)心具體的業(yè)務(wù)實(shí)現(xiàn)。達(dá)到了解耦的效果。