最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的BeanFactory工廠詳細(xì)解析

 更新時間:2023年12月05日 08:49:39   作者:遇見更好的自己、  
這篇文章主要介紹了Spring中的BeanFactory工廠詳細(xì)解析,Spring的本質(zhì)是一個bean工廠(beanFactory)或者說bean容器,它按照我們的要求,生產(chǎn)我們需要的各種各樣的bean,提供給我們使用,需要的朋友可以參考下

BeanFactory

Spring的本質(zhì)是一個bean工廠(beanFactory)或者說bean容器,它按照我們的要求,生產(chǎn)我們需要的各種各樣的bean,提供給我們使用。

只是在生產(chǎn)bean的過程中,需要解決bean之間的依賴問題,才引入了依賴注入(DI)這種技術(shù)。

也就是說依賴注入是beanFactory生產(chǎn)bean時為了解決bean之間的依賴的一種技術(shù)而已。

beanFactory會在bean的生命周期的各個階段中對bean進行各種管理,并且spring將這些階段通過各種接口暴露給我們,讓我們可以對bean進行各種處理,我們只要讓bean實現(xiàn)對應(yīng)的接口,那么spring就會在bean的生命周期調(diào)用我們實現(xiàn)的接口來處理該bean.

在介紹BeanFactory前,我們先想一個問題。

我們都知道BeanFactory主要的內(nèi)容是幫我們生成Bean信息和管理Bean信息,那么我們在xml文件中<baen>屬性的時候。

Spring是如何幫我們生成Bean的

BeanDefinitionReader 從xml文件、類路徑下使用了@Component系列注解的類、或者從@Configuration注解的配置類,獲取BeanDefintiions,然后注冊到BeanFactory中。

我們通過BeanDefinitionReader從不同的方式,獲取BeanDefintiions Bean的元數(shù)據(jù)。

BeanDefintiions是什么

protected AbstractBeanDefinition(BeanDefinition original) {
		setParentName(original.getParentName());
		setBeanClassName(original.getBeanClassName());
		setScope(original.getScope());
		setAbstract(original.isAbstract());
		setFactoryBeanName(original.getFactoryBeanName());
		setFactoryMethodName(original.getFactoryMethodName());
		setRole(original.getRole());
		setSource(original.getSource());
		copyAttributesFrom(original);
         。。。。。。省略
}

從上面的代碼我們大致的看出。BeanDefintiions其實就是對Bean的一些元數(shù)據(jù)定義

包括parenName 父類名稱 baenClassName:類名,scope bean的作用域。Abstract是否是抽象的等信息。

通過 BeanDefinitionReader獲取到BeanDefinition之后 。

我們在通過BeanDefinitionRegistry將beanDefinition注冊到BeanFacory中。

存儲在BeanFactory的一個conCurrentHashMap中。key為beanName,Value就是BeanDefinition元數(shù)據(jù)。

那么獲取Bean就從conCurrentHashMap中通過BeanName獲取對應(yīng)的Bean信息。

總結(jié)

從上面的分析:我們可以看到Bean的加載解析過程如下圖所示:

 接下來我們針對BeanDefinitionReader、BeanDefinitionRegistry、BeanFactory分別分析:

BeanDefinitionReader

1. XmlBeanDefinitionReader:

基于XML文件 讀取解析xml文件,通過Parser解析xml文件的標(biāo)簽。針對beans標(biāo)簽,生成對應(yīng)的BeanDefintions,然后注冊到BeanFactory中。 針對其他有特殊功能的標(biāo)簽,如context:component-scan,context:anotation-config,還可以生成BeanFactoryPostProcessor,BeanPostProcessor接口實現(xiàn)類的bean等;除了可以生成BeanDefinitions之外,還可以實現(xiàn)其他功能。NamespaceHandler:XML標(biāo)簽名稱空間處理器 被XmlBeanDefinitionReader使用,XmlBeanDefinitionReader在處理每個XML標(biāo)簽名稱空間的時候,如applicationContext.xml的context:,mvc:,通過一個DefaultNamespaceHandlerResolver來獲取對應(yīng)的NamespaceHandler實現(xiàn)類,然后通過這個NamespaceHandler實現(xiàn)類,進一步獲取該命名空間的內(nèi)部標(biāo)簽對應(yīng)的BeanDefinitionParser實現(xiàn)類。 被XmlBeanDefinitionReader使用,專門用于處理xml文件的beans標(biāo)簽的標(biāo)簽處理器。即XmlBeanDefinitionReader讀取xml文件,創(chuàng)建Document對象,然后交給BeanDefinitionDocumentReader處理。BeanDefinitionDocumentReader解析Document對象的Element節(jié)點,然后創(chuàng)建BeanDefinitions集合,通過XmlBeanDefinitionReader注冊到XmlBeanDefinitionReader所在的BeanFactory。  

2. AnnotatedBeanDefinitionReader

注冊指定的類列表annotatedClasses 可以使用編程方法,顯示指定將哪些類需要注冊到BeanFactory。 主要是被AnnotationConfigApplicationContext使用,即基于注解配置的ApplicationContext,這是SpringBoot的默認(rèn)ApplicationContext。典型使用為:先獲取所有使用了@Configuration注解的類,然后通過AnnotatedBeanDefinitionReader生成與這些類對應(yīng)的BeanDefinitions,并注冊到BeanFactory。

3. ClassPathBeanDefinitionScanner

注冊指定的basePackages下面的類 掃描指定類路徑(包)下面的類,檢測是否存在@Component注解及其子注解,從而生成BeanDefinition,然后注冊到BeanFactory。沒有實現(xiàn)BeanDefinitionReader接口,但基于相同的設(shè)計思路:BeanDefinitionReader。與AnnotatedBeanDefinitionReader一樣,都是獲取指定類,生成該類的BeanDefinition注冊到BeanFactory,而不是像xml文件一樣已經(jīng)通過bean標(biāo)簽顯示說明這個就是bean。也是主要是被AnnotationConfigApplicationContext使用。與其他兩種也是基于basePackages類路徑掃描的方式不同之處為:context:component-scan標(biāo)簽:基于XML的ApplicationContext,實現(xiàn)類路徑掃描,底層使用ComponentScanBeanDefinitionParser這個parser來處理。@ComponentScan:對于處理@Configuration配置類上面的@ComponentScan注解,則是通過ComponentScanAnnotationParser來處理的。

4. ConfigurationClassBeanDefinitionReader

基于@Configuration注解的類配置 處理@Configuration注解的配置類,加在這些配置類上面的注解,即與@Configuration一起使用的注解,如@ComponentScan,@PropertySource,@Import,@Profile等。 ConfigurationClassBeanDefinitionReader主要被ConfigurationClassPostProcessor調(diào)用,ConfigurationClassPostProcessor為BeanFactoryPostProcessor

BeanDefinitionRegistry

注冊BeanDefinitions。提供registerBeanDefinition,removeBeanDefinition等方法,用來從BeanFactory注冊或移除BeanDefinition。

通常BeanFactory接口的實現(xiàn)類需要實現(xiàn)這個接口。

實現(xiàn)類(通常為BeanFactory接口實現(xiàn)類)的對象實例,被DefinitionReader接口實現(xiàn)類引用,DefinitionReader將BeanDefintion注冊到該對象實例中。

除了上述的BeanDefinitionRegisry還有一個負(fù)責(zé)單例Bean注冊的接口:SingletonBeanRegistry

用于注冊單例Bean對象實例,實現(xiàn)類定義存儲Bean對象實例的map,BeanFactory的類層次結(jié)構(gòu)中需要實現(xiàn)這個接口,來提供Bean對象的注冊和從Bean對象實例的map獲取bean對象。

BeanFactory

接口具體實現(xiàn)類

1. DefaultListableBeanFactory 

BeanFactory接口體系的默認(rèn)實現(xiàn)類,實現(xiàn)以上接口的功能,提供BeanDefinition的存儲map,Bean對象對象的存儲map。

其中Bean對象實例的存儲map,定義在FactoryBeanRegistrySupport,FactoryBeanRegistrySupport實現(xiàn)了SingletonBeanRegistry接口,而DefaultListableBeanFactory的基類AbstractBeanFactory,繼承于FactoryBeanRegistrySupport。

2. StaticListableBeanFactory

用于存儲給定的bean對象實例,不支持動態(tài)注冊功能,是ListableBeanFactory接口的簡單實現(xiàn)。

beanFactoty后置處理器: BeanFactoryPostProcessor 

benFactoryPostProCessor是BeanFactory的后置處理器:

在BeanFactory創(chuàng)建好,加載好其所包含的所有beanDefinitions,但是還沒有實例化bean之前,執(zhí)行,具體為調(diào)用postProcessBeanFactory方法。

1. 加載更多的bean元數(shù)據(jù) ConfigurationClassPostProcessor,用于從BeanFactory中檢測使用了@Configuration注解的類,對于這些類對應(yīng)的BeanDefinitions集合,遍歷并依次交給ConfigurationClassParser,ConfigurationClassBeanDefinitionReader處理,分別是處理與@Configuration同時使用的其他注解和將類內(nèi)部的使用@Bean注解的方法,生成BeanDefinition,注冊到BeanFactory。

2. 對bean元數(shù)據(jù)進行加工處理 BeanDefinition屬性填充、修改:在postProcessBeanFactory方法中,可以對beanFactory所包含的beanDefinitions的propertyValues和構(gòu)造函數(shù)參數(shù)值進行修改,如使用PropertyPlaceHolderConfigurer來對BeanDefinition的propertyValues的占位符進行填充、賦值。或者使用PropertyResourceConfigurer獲取config文件中屬性,對BeanDefinitions的相關(guān)屬性進行賦值或者值覆蓋。

bean對象后置處理器:BeanPostProcessor

Bean后置處理器:負(fù)責(zé)對已創(chuàng)建好的bean對象進行加工處理。 

 主要是可以對新創(chuàng)建的bean實例進行修改,提供了一個類似于hook機制,對創(chuàng)建好的bean對象實例進行修改。

核心方法postProcessBeforeInitialization:在創(chuàng)建好bean實例,但是在任何初始化回調(diào)執(zhí)行之前,如InitializingBean的afterPropertiesSet,先執(zhí)行該方法。

postProcessAfterInitialization:在創(chuàng)建好bean實例,并且所有的初始化回調(diào)都執(zhí)行完了,如InitializingBean的afterPropertiesSet,再執(zhí)行該方法。  

至此:BeanFactory的Bean加載過程全部分析完成:

到此這篇關(guān)于Spring中的BeanFactory工廠詳細(xì)解析的文章就介紹到這了,更多相關(guān)BeanFactory工廠內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • alibaba?seata服務(wù)端具體實現(xiàn)

    alibaba?seata服務(wù)端具體實現(xiàn)

    seata是來處理分布式服務(wù)之間互相調(diào)用的事務(wù)問題,本文重點給大家介紹alibaba-seata實現(xiàn)方法,文中通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java微信公眾號推送模版消息的步驟示例詳解

    Java微信公眾號推送模版消息的步驟示例詳解

    模板消息是一種向用戶發(fā)送通知的服務(wù),廣泛用于訂單狀態(tài)更新、服務(wù)提醒等場景,下面,我將詳細(xì)介紹如何使用Java結(jié)合微信官方提供的API來實現(xiàn)模板消息的推送,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • SpringBoot整合MybatisPlus的基本應(yīng)用詳解

    SpringBoot整合MybatisPlus的基本應(yīng)用詳解

    MyBatis-Plus (簡稱 MP)是一個 MyBatis的增強工具,在 MyBatis 的基礎(chǔ)上只做增強不做改變,為 簡化開發(fā)、提高效率而生,本文將給大家介紹一下SpringBoot整合MybatisPlus的基本應(yīng)用,需要的朋友可以參考下
    2024-05-05
  • Java Semaphore信號量使用分析講解

    Java Semaphore信號量使用分析講解

    Semaphore實際上是一種共享鎖,因為它允許多個線程并發(fā)獲取共享的資源,在Semaphore對象創(chuàng)建時必須設(shè)置可用令牌的初始數(shù)量permits,用于控制并發(fā)時同時獲取資源權(quán)限的線程數(shù)量,這篇文章主要介紹了Java中的Semaphore如何使用,需要的朋友可以參考下
    2022-12-12
  • java中的Io(input與output)操作總結(jié)(一)

    java中的Io(input與output)操作總結(jié)(一)

    所謂IO,也就是Input與Output的縮寫。在java中,IO涉及的范圍比較大,這里主要討論針對文件內(nèi)容的讀寫,感興趣的朋友可以了解下
    2013-01-01
  • Java基礎(chǔ)之Bean的創(chuàng)建、定位和使用

    Java基礎(chǔ)之Bean的創(chuàng)建、定位和使用

    這篇文章主要介紹了Java基礎(chǔ)之Bean的創(chuàng)建、定位和使用,文中有非常詳細(xì)的圖文示例及代碼,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • springboot之端口設(shè)置和contextpath的配置方式

    springboot之端口設(shè)置和contextpath的配置方式

    這篇文章主要介紹了springboot之端口設(shè)置和contextpath的配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 全面解析Java中的GC與幽靈引用

    全面解析Java中的GC與幽靈引用

    一般的應(yīng)用程序不會涉及到 Reference 編程, 但是了解這些知識會對理解 GC 的工作原理以及性能調(diào)優(yōu)有一定幫助,在實現(xiàn)一些基礎(chǔ)性設(shè)施比如緩存時也可能會用到,希望本文能有所幫助
    2013-09-09
  • SpringBoot中的@Component注解源碼

    SpringBoot中的@Component注解源碼

    在SpringBoot中,@Component注解用于標(biāo)識一個類為Bean,并由Spring進行管理,它需要配合@ComponentScan注解使用,后者負(fù)責(zé)掃描包含@Component的類,并進行自動裝配,本文給大家介紹SpringBoot中的@Component注解源碼,感興趣的朋友一起看看吧
    2024-01-01
  • java微信公眾號支付示例詳解

    java微信公眾號支付示例詳解

    這篇文章主要為大家詳細(xì)介紹了java微信公眾號支付示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評論

遂川县| 明水县| 凉城县| 台东县| 陇川县| 瑞金市| 萨嘎县| 铁岭县| 团风县| 出国| 平度市| 遵化市| 盐边县| 新竹市| 桐乡市| 惠来县| 静海县| 黑龙江省| 伊吾县| 黎平县| 三原县| 临城县| 德昌县| 获嘉县| 威海市| 陆丰市| 航空| 桑植县| 咸宁市| 积石山| 夏津县| 新乡县| 罗城| 永仁县| 深泽县| 阳新县| 马鞍山市| 阿拉善盟| 宁化县| 巴里| 横峰县|