Spring IoC容器知識點(diǎn)詳解
可以把 Spring IoC 容器比作一間餐館,當(dāng)你來到餐館,通常會直接招呼服務(wù)員:點(diǎn)菜!至于菜的原料是什么?如何用原料把菜做出來?可能你根本就不關(guān)心。IoC 容器也是一樣,你只需要告訴它需要某個bean,它就把對應(yīng)的實(shí)例(instance)扔給你,至于這個bean是否依賴其他組件,怎樣完成它的初始化,根本就不需要你關(guān)心。
作為餐館,想要做出菜肴,得知道菜的原料和菜譜,同樣地,IoC 容器想要管理各個業(yè)務(wù)對象以及它們之間的依賴關(guān)系,需要通過某種途徑來記錄和管理這些信息。BeanDefinition對象就承擔(dān)了這個責(zé)任:容器中的每一個 bean 都會有一個對應(yīng)的 BeanDefinition 實(shí)例,該實(shí)例負(fù)責(zé)保存bean對象的所有必要信息,包括 bean 對象的 class 類型、是否是抽象類、構(gòu)造方法和參數(shù)、其它屬性等等。當(dāng)客戶端向容器請求相應(yīng)對象時,容器就會通過這些信息為客戶端返回一個完整可用的 bean 實(shí)例。微信搜索 web_resource 關(guān)注后獲取更多干貨!
原材料已經(jīng)準(zhǔn)備好(把 BeanDefinition 看著原料),開始做菜吧,等等,你還需要一份菜譜,BeanDefinitionRegistry和BeanFactory就是這份菜譜,BeanDefinitionRegistry 抽象出 bean 的注冊邏輯,而 BeanFactory 則抽象出了 bean 的管理邏輯,而各個 BeanFactory 的實(shí)現(xiàn)類就具體承擔(dān)了 bean 的注冊以及管理工作。它們之間的關(guān)系就如下圖:

DefaultListableBeanFactory作為一個比較通用的 BeanFactory 實(shí)現(xiàn),它同時也實(shí)現(xiàn)了 BeanDefinitionRegistry 接口,因此它就承擔(dān)了 Bean 的注冊管理工作。從圖中也可以看出,BeanFactory 接口中主要包含 getBean、containBean、getType、getAliases 等管理 bean 的方法,而 BeanDefinitionRegistry 接口則包含 registerBeanDefinition、removeBeanDefinition、getBeanDefinition 等注冊管理 BeanDefinition 的方法。
下面通過一段簡單的代碼來模擬 BeanFactory 底層是如何工作的:
// 默認(rèn)容器實(shí)現(xiàn)
DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
// 根據(jù)業(yè)務(wù)對象構(gòu)造相應(yīng)的BeanDefinition
AbstractBeanDefinition definition = new RootBeanDefinition(Business.class,true);
// 將bean定義注冊到容器中
beanRegistry.registerBeanDefinition("beanName",definition);
// 如果有多個bean,還可以指定各個bean之間的依賴關(guān)系
// ........
// 然后可以從容器中獲取這個bean的實(shí)例
// 注意:這里的beanRegistry其實(shí)實(shí)現(xiàn)了BeanFactory接口,所以可以強(qiáng)轉(zhuǎn),
// 單純的BeanDefinitionRegistry是無法強(qiáng)制轉(zhuǎn)換到BeanFactory類型的
BeanFactory container = (BeanFactory)beanRegistry;
Business business = (Business)container.getBean("beanName");
這段代碼僅為了說明 BeanFactory 底層的大致工作流程,實(shí)際情況會更加復(fù)雜,比如 bean 之間的依賴關(guān)系可能定義在外部配置文件(XML/Properties)中、也可能是注解方式。Spring IoC 容器的整個工作流程大致可以分為兩個階段
以上就是本次介紹的全部知識點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對腳本之家的支持。
相關(guān)文章
Spring之關(guān)于PropertyDescriptor的擴(kuò)展剖析
這篇文章主要介紹了Spring之關(guān)于PropertyDescriptor的擴(kuò)展剖析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
SpringCloud?Tencent?全套解決方案源碼分析
Spring Cloud Tencent實(shí)現(xiàn)Spring Cloud標(biāo)準(zhǔn)微服務(wù)SPI,開發(fā)者可以基于Spring Cloud Tencent開發(fā)Spring Cloud微服務(wù)架構(gòu)應(yīng)用,Spring Cloud Tencent 的核心依托騰訊開源的一站式服務(wù)發(fā)現(xiàn)與治理平臺 Polarismesh,實(shí)現(xiàn)各種分布式微服務(wù)場景,感興趣的朋友一起看看吧2022-07-07
java面試LruCache?和?LinkedHashMap及算法實(shí)現(xiàn)
這篇文章主要為大家介紹了java面試LruCache?和?LinkedHashMap及算法實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Spring Cloud Feign接口返回流的實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud Feign接口返回流的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Java使用redisson實(shí)現(xiàn)分布式鎖的示例詳解
這篇文章主要為大家詳細(xì)介紹了在Java項目中使用redisson實(shí)現(xiàn)分布式鎖,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的可以參考一下2023-07-07
詳解使用Spring Security進(jìn)行自動登錄驗(yàn)證
本篇文章主要介紹了詳解使用Spring Security進(jìn)行自動登錄驗(yàn)證,非常具有實(shí)用價值,需要的朋友可以參考下2017-09-09

