IoC:Inverse of Control(控制反轉(zhuǎn))為了更好的理解用可以這樣通俗易懂的這樣講:IOC主要是說(shuō)是new一個(gè)類(lèi)來(lái)使用,方式分為:開(kāi)發(fā)這手動(dòng)創(chuàng)建和SpringIOC容器創(chuàng)建(控制反轉(zhuǎn))。
一個(gè)例子控制反轉(zhuǎn)顯然是一個(gè)抽象的概念,我們舉一個(gè)鮮明的例子來(lái)說(shuō)明。 在現(xiàn)實(shí)生活中,人們要用到一樣?xùn)|西的時(shí)候,第一反應(yīng)就是去找到這件東西,比如想喝新鮮橙汁,在沒(méi)有飲品店的日子里,最直觀的做法就是:買(mǎi)果汁機(jī)、買(mǎi)橙子,然后準(zhǔn)備開(kāi)水。值得注意的是:這些都是你自己“主動(dòng)”創(chuàng)造的過(guò)程,也就是說(shuō)一杯橙汁需要你自己創(chuàng)造。 然而到了今時(shí)今日,由于飲品店的盛行,當(dāng)我們想喝橙汁時(shí),第一想法就轉(zhuǎn)換成了找到飲品店的聯(lián)系方式,通過(guò)電話等渠道描述你的需要、地址、聯(lián)系方式等,下訂單等待,過(guò)一會(huì)兒就會(huì)有人送來(lái)橙汁了。 請(qǐng)注意你并沒(méi)有“主動(dòng)”去創(chuàng)造橙汁,橙汁是由飲品店創(chuàng)造的,而不是你,然而也完全達(dá)到了你的要求,甚至比你創(chuàng)造的要好上那么一些。 Spring IoC 闡述這就是一種控制反轉(zhuǎn)的理念,上述的例子已經(jīng)很好的說(shuō)明了問(wèn)題,我們?cè)賮?lái)描述一下控制反轉(zhuǎn)的概念:控制反轉(zhuǎn)是一種通過(guò)描述(在 Java 中可以是 XML 或者注解)并通過(guò)第三方(Spring)去產(chǎn)生或獲取特定對(duì)象的方式。
主動(dòng)創(chuàng)建的模式中,責(zé)任歸于開(kāi)發(fā)者,而在被動(dòng)的模式下,責(zé)任歸于 IoC 容器,基于這樣的被動(dòng)形式,我們就說(shuō)對(duì)象被控制反轉(zhuǎn)了。(也可以說(shuō)是反轉(zhuǎn)了控制) Spring IoC 容器Spring 會(huì)提供 IoC 容器來(lái)管理和容納我們所開(kāi)發(fā)的各種各樣的 Bean,并且我們可以從中獲取各種發(fā)布在 Spring IoC 容器里的 Bean,并且通過(guò)描述可以得到它。 Spring IoC 容器的設(shè)計(jì)Spring IoC 容器的設(shè)計(jì)主要是基于以下兩個(gè)接口:
其中 ApplicationContext 是 BeanFactory 的子接口之一,換句話說(shuō):BeanFactory 是 Spring IoC 容器所定義的最底層接口,而 ApplicationContext 是其最高級(jí)接口之一,并對(duì) BeanFactory 功能做了許多的擴(kuò)展,所以在絕大部分的工作場(chǎng)景下,都會(huì)使用 ApplicationContext 作為 Spring IoC 容器。 BeanFactory從上圖中我們可以幾乎看到, BeanFactory 位于設(shè)計(jì)的最底層,它提供了 Spring IoC 最底層的設(shè)計(jì),為此,我們先來(lái)看看該類(lèi)中提供了哪些方法: 由于這個(gè)接口的重要性,所以有必要在這里作一下簡(jiǎn)短的說(shuō)明:
這就是 Spring IoC 最底層的設(shè)計(jì),所有關(guān)于 Spring IoC 的容器將會(huì)遵守它所定義的方法。 ApplicationContext根據(jù) ApplicationContext 的類(lèi)繼承關(guān)系圖,可以看到 ApplicationContext 接口擴(kuò)展了許許多多的接口,因此它的功能十分強(qiáng)大,所以在實(shí)際應(yīng)用中常常會(huì)使用到的是 ApplicationContext 接口,因?yàn)?BeanFactory 的方法和功能較少,而 ApplicationContext 的方法和功能較多。 通過(guò)上一篇 IoC 的例子,我們來(lái)認(rèn)識(shí)一個(gè) ApplicationContext 的子類(lèi)——ClassPathXmlApplicationContext。
這樣就會(huì)使用 Application 的實(shí)現(xiàn)類(lèi) ClassPathXmlApplicationContext 去初始化 Spring IoC 容器,然后開(kāi)發(fā)者就可以通過(guò) IoC 容器來(lái)獲取資源了啦!
ApplicationContext 常見(jiàn)實(shí)現(xiàn)類(lèi):1.ClassPathXmlApplicationContext:
2:FileSystemXmlApplicationContext:-
3.XmlWebApplicationContext:
BeanFactory 和 ApplicationContext 的區(qū)別:
Spring IoC 的容器的初始化和依賴(lài)注入雖然 Spring IoC 容器的生成十分的復(fù)雜,但是大體了解一下 Spring IoC 初始化的過(guò)程還是必要的。這對(duì)于理解 Spring 的一系列行為是很有幫助的。 注意:Bean 的定義和初始化在 Spring IoC 容器是兩大步驟,它是先定義,然后初始化和依賴(lài)注入的。
做完了以上 3 步,Bean 就在 Spring IoC 容器中被定義了,而沒(méi)有被初始化,更沒(méi)有完成依賴(lài)注入,也就是沒(méi)有注入其配置的資源給 Bean,那么它還不能完全使用。 對(duì)于初始化和依賴(lài)注入,Spring Bean 還有一個(gè)配置選項(xiàng)——【lazy-init】,其含義就是是否初始化 Spring Bean。在沒(méi)有任何配置的情況下,它的默認(rèn)值為 default,實(shí)際值為 false,也就是 Spring IoC 默認(rèn)會(huì)自動(dòng)初始化 Bean。如果將其設(shè)置為 true,那么只有當(dāng)我們使用 Spring IoC 容器的 getBean 方法獲取它時(shí),它才會(huì)進(jìn)行 Bean 的初始化,完成依賴(lài)注入。 來(lái)源:https://www./content-4-595351.html |
|
來(lái)自: 印度阿三17 > 《開(kāi)發(fā)》