Spring IoC容器知識點詳解
可以把 Spring IoC 容器比作一間餐館,當(dāng)你來到餐館,通常會直接招呼服務(wù)員:點菜!至于菜的原料是什么?如何用原料把菜做出來?可能你根本就不關(guān)心。IoC 容器也是一樣,你只需要告訴它需要某個bean,它就把對應(yīng)的實例(instance)扔給你,至于這個bean是否依賴其他組件,怎樣完成它的初始化,根本就不需要你關(guān)心。
作為餐館,想要做出菜肴,得知道菜的原料和菜譜,同樣地,IoC 容器想要管理各個業(yè)務(wù)對象以及它們之間的依賴關(guān)系,需要通過某種途徑來記錄和管理這些信息。BeanDefinition對象就承擔(dān)了這個責(zé)任:容器中的每一個 bean 都會有一個對應(yīng)的 BeanDefinition 實例,該實例負(fù)責(zé)保存bean對象的所有必要信息,包括 bean 對象的 class 類型、是否是抽象類、構(gòu)造方法和參數(shù)、其它屬性等等。當(dāng)客戶端向容器請求相應(yīng)對象時,容器就會通過這些信息為客戶端返回一個完整可用的 bean 實例。微信搜索 web_resource 關(guān)注后獲取更多干貨!
原材料已經(jīng)準(zhǔn)備好(把 BeanDefinition 看著原料),開始做菜吧,等等,你還需要一份菜譜,BeanDefinitionRegistry和BeanFactory就是這份菜譜,BeanDefinitionRegistry 抽象出 bean 的注冊邏輯,而 BeanFactory 則抽象出了 bean 的管理邏輯,而各個 BeanFactory 的實現(xiàn)類就具體承擔(dān)了 bean 的注冊以及管理工作。它們之間的關(guān)系就如下圖:
DefaultListableBeanFactory作為一個比較通用的 BeanFactory 實現(xiàn),它同時也實現(xiàn)了 BeanDefinitionRegistry 接口,因此它就承擔(dān)了 Bean 的注冊管理工作。從圖中也可以看出,BeanFactory 接口中主要包含 getBean、containBean、getType、getAliases 等管理 bean 的方法,而 BeanDefinitionRegistry 接口則包含 registerBeanDefinition、removeBeanDefinition、getBeanDefinition 等注冊管理 BeanDefinition 的方法。
下面通過一段簡單的代碼來模擬 BeanFactory 底層是如何工作的:
// 默認(rèn)容器實現(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的實例 // 注意:這里的beanRegistry其實實現(xiàn)了BeanFactory接口,所以可以強轉(zhuǎn), // 單純的BeanDefinitionRegistry是無法強制轉(zhuǎn)換到BeanFactory類型的 BeanFactory container = (BeanFactory)beanRegistry; Business business = (Business)container.getBean("beanName");
這段代碼僅為了說明 BeanFactory 底層的大致工作流程,實際情況會更加復(fù)雜,比如 bean 之間的依賴關(guān)系可能定義在外部配置文件(XML/Properties)中、也可能是注解方式。Spring IoC 容器的整個工作流程大致可以分為兩個階段
以上就是本次介紹的全部知識點內(nèi)容,感謝大家的學(xué)習(xí)和對腳本之家的支持。
相關(guān)文章
在Struts2中如何將父類屬性序列化為JSON格式的解決方法
本篇文章,小編將為大家介紹關(guān)于在Struts2中如何將父類屬性序列化為JSON格式的解決方法,有需要的朋友可以參考一下2013-04-04JAVA中字符串函數(shù)subString的用法小結(jié)
本篇文章主要是對JAVA中字符串函數(shù)subString的用法進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02Java中Collection、List、Set、Map之間的關(guān)系總結(jié)
今天小編就為大家分享一篇關(guān)于Java中Collection、List、Set、Map之間的關(guān)系總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02SpringCloud微服務(wù)應(yīng)用config配置中心詳解
這篇文章主要介紹了SpringCloud微服務(wù)應(yīng)用-config配置中心,包括相關(guān)知識介紹、搭建、動態(tài)刷新、測試,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07解決Springboot項目報錯:java:錯誤:不支持發(fā)行版本?17
這篇文章主要給大家介紹了關(guān)于解決Springboot項目報錯:java:錯誤:不支持發(fā)行版本17的相關(guān)資料,這個錯誤意味著你的Spring Boot項目正在使用Java 17這個版本,但是你的項目中未配置正確的Java版本,需要的朋友可以參考下2023-08-08