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

Spring中的之啟動過程obtainFreshBeanFactory詳解

 更新時(shí)間:2024年02月14日 08:27:45   作者:thewindkee  
這篇文章主要介紹了Spring中的之啟動過程obtainFreshBeanFactory詳解,在refresh時(shí),prepareRefresh后,馬上就調(diào)用了obtainFreshBeanFactory創(chuàng)建beanFactory以及掃描bean信息(beanDefinition),并通過BeanDefinitionRegistry注冊到容器中,需要的朋友可以參考下

1.refresh流程

refresh是spring啟動的關(guān)鍵方法,refresh啟動過程中,先要得到beanFactory 以及 需要交給beanFactory管理的bean。

在refresh時(shí),prepareRefresh后,馬上就調(diào)用了obtainFreshBeanFactory創(chuàng)建beanFactory以及掃描bean信息(beanDefinition),并通過BeanDefinitionRegistry注冊到容器中。

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			prepareRefresh();
			// Tell the subclass to refresh the internal bean factory.
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
		//后面省略
		....
		}
	}

2.obtainFreshBeanFactory掃描bean定義信息并注冊

這里以通過XML配置spring來舉例。

  1. 創(chuàng)建DefaultListableBeanFactory,設(shè)置是否支持beanDefinition重寫以及是否支持循環(huán)引用。
  2. 載入beanDefinition
    • 得到所有spring相關(guān)的xml,將其轉(zhuǎn)為Document對象。
    • 解析Document,判斷node是否屬于beans(http://www.springframework.org/schema/beans)這個(gè)命名空間(Namespace)。針對默認(rèn)命名空間(beans)和非默認(rèn)空間,有不同的處理。
      • 處理默認(rèn)命名空間相關(guān)node:import,alias,bean,beans4種node。
      • 處理非默認(rèn)命名空間相關(guān)node,如:<context:annotation-config/>、<context:component-scan base-package="xx"/>、<mongo:mongo-client/>
      • 注冊beanDefinition

obtainFreshBeanFactory重要流程

在這里插入圖片描述

3.必須了解的類

3.1 beanDefinition

包含欲交給spring管理的bean信息 掃描了一個(gè)對象的信息,包括class,property等。

3.2 NamespaceHandler

注冊自定義解析類 該接口的作用:注冊可解析xml中自定義的標(biāo)簽Parser。 實(shí)現(xiàn)類類名與命名空間名字對應(yīng)。

常見的NamespaceHandler實(shí)例:ContextNamespaceHandler 很明顯能看出有常用的 <context:annotation-config/>、<context:component-scan base-package="xx"/>、<context:property-placeholder/>對應(yīng)的解析類。

public class ContextNamespaceHandler extends NamespaceHandlerSupport {
	@Override
	public void init() {
		registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());
		registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());
		registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser());
		registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());
		registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser());
		registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
		registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser());
		registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser());
	}
}

3.3 BeanDefinitionParser接口

配合DefaultBeanDefinitionDocumentReader去解析xml中自定義的標(biāo)簽。 接口需要實(shí)現(xiàn)BeanDefinition parse(Element element, ParserContext parserContext);方法,該方法返回一個(gè)beanDefination。但是實(shí)際都沒有處理這個(gè)返回值, 在parse內(nèi)部就解析beanDefination并注冊到beanDefinationMap中了。 實(shí)現(xiàn)類與節(jié)點(diǎn)名稱對應(yīng)。

3.4 BeanDefinitionParser與ContextNamespaceHandler的關(guān)系

類似于 xHandler.put(“a”,parserA); Handler.put(“b”,parserB); 當(dāng)處理非默認(rèn)命名空間的節(jié)點(diǎn)時(shí),如x命名空間中的<a>節(jié)點(diǎn),使用xHandler.get(“a”).parse來解析并注冊beanDefinition

4.處理默認(rèn)命名空間

以處理<bean>為例,調(diào)用裝飾器去解析delegate.parseBeanDefinitionElement(ele)將bean上的屬性,如id,name,property,class等,并返回一個(gè)BeanDefinition對象。然后調(diào)用BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry())將其注冊到beanDefinitionMap中。

5.處理非默認(rèn)命名空間

根據(jù)命名空間得到對應(yīng)的NamespaceHandler,然后調(diào)用節(jié)點(diǎn)對應(yīng)的parser去解析注冊beanDefinition.

如context命名空間中解析<context:component-scan base-package="com.gkwind.xxx"/>的ComponentScanBeanDefinitionParser

這里解析有點(diǎn)復(fù)雜,但思路很簡單: 從xml文件對應(yīng)的element中處理對應(yīng)的node。將node的屬性裝配成beanDefinition或者利用其屬性代表的特殊含義去注冊beanDefinition. 如這里<context:component-scan base-package="com.gkwind.xxx"/>),就表明需要:

1.掃描這個(gè)包下面的所有class。

2.將符合filter的class包裝為beanDefinition并注冊到beanDefinitionMap中。

如:含有@Component等注解的class

在這里插入圖片描述

6.debug的時(shí)候遇到的問題

DefaultNamespaceHandlerResolver的toString方法會觸發(fā)getHandlerMappings,而使用idea debug的時(shí)候會調(diào)用toString引起handlerMapping初始化,導(dǎo)致看到handlerMapping莫名的出現(xiàn)值。

	@Override
	public String toString() {
		return "NamespaceHandlerResolver using mappings " + getHandlerMappings();
	}

7.整體流程

在這里插入圖片描述

8.其他

注冊beanDefinition需要關(guān)注org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition,它會將beanDefinition加入beanDefinitionMap中。

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

相關(guān)文章

  • java設(shè)計(jì)模式筆記之裝飾模式

    java設(shè)計(jì)模式筆記之裝飾模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式筆記之裝飾模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java后臺批量生產(chǎn)echarts圖表并保存圖片

    Java后臺批量生產(chǎn)echarts圖表并保存圖片

    這篇文章主要介紹了Java后臺批量生產(chǎn)echarts圖表并保存圖片,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • idea中一鍵自動生成序列化serialVersionUID方式

    idea中一鍵自動生成序列化serialVersionUID方式

    這篇文章主要介紹了idea中一鍵自動生成序列化serialVersionUID方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java三大特性之多態(tài)詳解

    Java三大特性之多態(tài)詳解

    多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦浴6鄳B(tài): 是指同一行為,具有多個(gè)不同表現(xiàn)形式。本文將來和大家詳細(xì)說說Java中的多態(tài),需要的可以了解一下
    2022-10-10
  • SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理詳解

    SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • SpringBoot中Dozer的使用小結(jié)

    SpringBoot中Dozer的使用小結(jié)

    dozer是用來兩個(gè)對象之間屬性轉(zhuǎn)換的工具,有了這個(gè)工具之后,我們將一個(gè)對象的所有屬性值轉(zhuǎn)給另一個(gè)對象時(shí),就不需要再去寫重復(fù)的set和get方法了,下面介紹下SpringBoot中Dozer的使用,感興趣的朋友一起看看吧
    2022-03-03
  • java開發(fā)之鬧鐘的實(shí)現(xiàn)代碼

    java開發(fā)之鬧鐘的實(shí)現(xiàn)代碼

    本篇文章介紹了,在java中鬧鐘的實(shí)現(xiàn)代碼。需要的朋友參考下
    2013-05-05
  • SpringMVC記錄我遇到的坑_AOP注解無效,切面不執(zhí)行的解決

    SpringMVC記錄我遇到的坑_AOP注解無效,切面不執(zhí)行的解決

    這篇文章主要介紹了SpringMVC記錄我遇到的坑_AOP注解無效,切面不執(zhí)行的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java比較兩個(gè)對象中全部屬性值是否相等的方法

    Java比較兩個(gè)對象中全部屬性值是否相等的方法

    本文主要介紹了Java比較兩個(gè)對象中全部屬性值是否相等的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Springboot自帶線程池的實(shí)現(xiàn)

    Springboot自帶線程池的實(shí)現(xiàn)

    本文主要介紹了Springboot自帶線程池的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評論