欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

BeanFactory

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

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

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

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

在介紹BeanFactory前,我們先想一個(gè)問(wèn)題。

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

Spring是如何幫我們生成Bean的

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

我們通過(guò)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其實(shí)就是對(duì)Bean的一些元數(shù)據(jù)定義

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

通過(guò) BeanDefinitionReader獲取到BeanDefinition之后 。

我們?cè)谕ㄟ^(guò)BeanDefinitionRegistry將beanDefinition注冊(cè)到BeanFacory中。

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

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

總結(jié)

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

 接下來(lái)我們針對(duì)BeanDefinitionReader、BeanDefinitionRegistry、BeanFactory分別分析:

BeanDefinitionReader

1. XmlBeanDefinitionReader:

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

2. AnnotatedBeanDefinitionReader

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

3. ClassPathBeanDefinitionScanner

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

4. ConfigurationClassBeanDefinitionReader

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

BeanDefinitionRegistry

注冊(cè)BeanDefinitions。提供registerBeanDefinition,removeBeanDefinition等方法,用來(lái)從BeanFactory注冊(cè)或移除BeanDefinition。

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

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

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

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

BeanFactory

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

1. DefaultListableBeanFactory 

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

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

2. StaticListableBeanFactory

用于存儲(chǔ)給定的bean對(duì)象實(shí)例,不支持動(dòng)態(tài)注冊(cè)功能,是ListableBeanFactory接口的簡(jiǎn)單實(shí)現(xiàn)。

beanFactoty后置處理器: BeanFactoryPostProcessor 

benFactoryPostProCessor是BeanFactory的后置處理器:

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

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

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

bean對(duì)象后置處理器:BeanPostProcessor

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

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

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

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

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

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

相關(guān)文章

  • 生產(chǎn)環(huán)境jvm常用的參數(shù)設(shè)置建議分享

    生產(chǎn)環(huán)境jvm常用的參數(shù)設(shè)置建議分享

    在Java應(yīng)用程序的部署過(guò)程中,合理配置JVM(Java虛擬機(jī))參數(shù)對(duì)于提升應(yīng)用性能、穩(wěn)定性和資源利用效率至關(guān)重要,本文將探討一些常用的JVM參數(shù)設(shè)置建議,幫助開(kāi)發(fā)者在生產(chǎn)環(huán)境中優(yōu)化Java應(yīng)用,需要的朋友可以參考下
    2025-04-04
  • spring-boot讀取props和yml配置文件的方法

    spring-boot讀取props和yml配置文件的方法

    本篇文章主要介紹了spring-boot讀取props和yml配置文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Spring?Boot項(xiàng)目如何使用Maven打包并帶上依賴

    Spring?Boot項(xiàng)目如何使用Maven打包并帶上依賴

    在這篇博客中,介紹如何使用Maven將Spring?Boot項(xiàng)目及其依賴項(xiàng)打包成一個(gè)可執(zhí)行的jar文件。我們將使用Spring?Boot的spring-boot-maven-plugin插件來(lái)完成這個(gè)任務(wù),感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • VSCode?配置?Spring?Boot?項(xiàng)目開(kāi)發(fā)環(huán)境的全過(guò)程

    VSCode?配置?Spring?Boot?項(xiàng)目開(kāi)發(fā)環(huán)境的全過(guò)程

    兩三年前曾經(jīng)試過(guò)配置Java環(huán)境, 存在不少問(wèn)題作罷. 最近搜了下相關(guān)的文章, 感覺(jué)VSCode對(duì)Java項(xiàng)目的支持比三年前完善了不少. 今天實(shí)際配置了一下環(huán)境, 把自己常用的功能過(guò)了一遍, 基本能跑通開(kāi)發(fā)流程, 做個(gè)筆記,需要的朋友可以參考下
    2024-03-03
  • java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容

    java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容

    這篇文章主要介紹了java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • java利用url實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容的抓取

    java利用url實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容的抓取

    本文主要介紹了java利用url實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容抓取的示例。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 聊聊SpringBoot中組件無(wú)法被注入的問(wèn)題

    聊聊SpringBoot中組件無(wú)法被注入的問(wèn)題

    這篇文章主要介紹了SpringBoot中組件無(wú)法被注入的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring Boot 功能整合的實(shí)現(xiàn)

    Spring Boot 功能整合的實(shí)現(xiàn)

    Spring Boot生態(tài)豐富,集成也不算困難。本文簡(jiǎn)單的介紹下功能整合的步驟,最后提供一個(gè)具體的實(shí)現(xiàn)例子,學(xué)習(xí)Spring Boot的同學(xué)可以參考下
    2021-05-05
  • 詳解Java中的反射機(jī)制和動(dòng)態(tài)代理

    詳解Java中的反射機(jī)制和動(dòng)態(tài)代理

    本文將詳細(xì)介紹反射機(jī)制以及動(dòng)態(tài)代理機(jī)制,而且基本現(xiàn)在的主流框架都應(yīng)用了反射機(jī)制,如spring、MyBatis、Hibernate等等,這就有非常重要的學(xué)習(xí)意義
    2021-06-06
  • 關(guān)于java命令的本質(zhì)邏輯揭秘過(guò)程

    關(guān)于java命令的本質(zhì)邏輯揭秘過(guò)程

    Java是通過(guò)java虛擬機(jī)來(lái)裝載和執(zhí)行編譯文件(class文件)的,java虛擬機(jī)通過(guò)命令java  option 來(lái)啟動(dòng),這篇文章主要給大家介紹了關(guān)于java命令的本質(zhì)邏輯揭秘的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-05-05

最新評(píng)論