溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring中IoC容器知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2021-08-17 11:40:43 來(lái)源:億速云 閱讀:116 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下Spring中IoC容器知識(shí)點(diǎn)有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

可以把 Spring IoC 容器比作一間餐館,當(dāng)你來(lái)到餐館,通常會(huì)直接招呼服務(wù)員:點(diǎn)菜!至于菜的原料是什么?如何用原料把菜做出來(lái)?可能你根本就不關(guān)心。IoC 容器也是一樣,你只需要告訴它需要某個(gè)bean,它就把對(duì)應(yīng)的實(shí)例(instance)扔給你,至于這個(gè)bean是否依賴其他組件,怎樣完成它的初始化,根本就不需要你關(guān)心。

作為餐館,想要做出菜肴,得知道菜的原料和菜譜,同樣地,IoC 容器想要管理各個(gè)業(yè)務(wù)對(duì)象以及它們之間的依賴關(guān)系,需要通過(guò)某種途徑來(lái)記錄和管理這些信息。BeanDefinition對(duì)象就承擔(dān)了這個(gè)責(zé)任:容器中的每一個(gè) bean 都會(huì)有一個(gè)對(duì)應(yīng)的 BeanDefinition 實(shí)例,該實(shí)例負(fù)責(zé)保存bean對(duì)象的所有必要信息,包括 bean 對(duì)象的 class 類型、是否是抽象類、構(gòu)造方法和參數(shù)、其它屬性等等。當(dāng)客戶端向容器請(qǐng)求相應(yīng)對(duì)象時(shí),容器就會(huì)通過(guò)這些信息為客戶端返回一個(gè)完整可用的 bean 實(shí)例。微信搜索 web_resource 關(guān)注后獲取更多干貨!

原材料已經(jīng)準(zhǔn)備好(把 BeanDefinition 看著原料),開始做菜吧,等等,你還需要一份菜譜,BeanDefinitionRegistry和BeanFactory就是這份菜譜,BeanDefinitionRegistry 抽象出 bean 的注冊(cè)邏輯,而 BeanFactory 則抽象出了 bean 的管理邏輯,而各個(gè) BeanFactory 的實(shí)現(xiàn)類就具體承擔(dān)了 bean 的注冊(cè)以及管理工作。它們之間的關(guān)系就如下圖:

Spring中IoC容器知識(shí)點(diǎn)有哪些

DefaultListableBeanFactory作為一個(gè)比較通用的 BeanFactory 實(shí)現(xiàn),它同時(shí)也實(shí)現(xiàn)了 BeanDefinitionRegistry 接口,因此它就承擔(dān)了 Bean 的注冊(cè)管理工作。從圖中也可以看出,BeanFactory 接口中主要包含 getBean、containBean、getType、getAliases 等管理 bean 的方法,而 BeanDefinitionRegistry 接口則包含 registerBeanDefinition、removeBeanDefinition、getBeanDefinition 等注冊(cè)管理 BeanDefinition 的方法。

下面通過(guò)一段簡(jiǎn)單的代碼來(lái)模擬 BeanFactory 底層是如何工作的:

// 默認(rèn)容器實(shí)現(xiàn)
DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
// 根據(jù)業(yè)務(wù)對(duì)象構(gòu)造相應(yīng)的BeanDefinition
AbstractBeanDefinition definition = new RootBeanDefinition(Business.class,true);
// 將bean定義注冊(cè)到容器中
beanRegistry.registerBeanDefinition("beanName",definition);
// 如果有多個(gè)bean,還可以指定各個(gè)bean之間的依賴關(guān)系
// ........




// 然后可以從容器中獲取這個(gè)bean的實(shí)例
// 注意:這里的beanRegistry其實(shí)實(shí)現(xiàn)了BeanFactory接口,所以可以強(qiáng)轉(zhuǎn),
// 單純的BeanDefinitionRegistry是無(wú)法強(qiáng)制轉(zhuǎn)換到BeanFactory類型的
BeanFactory container = (BeanFactory)beanRegistry;
Business business = (Business)container.getBean("beanName");

這段代碼僅為了說(shuō)明 BeanFactory 底層的大致工作流程,實(shí)際情況會(huì)更加復(fù)雜,比如 bean 之間的依賴關(guān)系可能定義在外部配置文件(XML/Properties)中、也可能是注解方式。Spring IoC 容器的整個(gè)工作流程大致可以分為兩個(gè)階段

以上是“Spring中IoC容器知識(shí)點(diǎn)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI