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

Spring中的之啟動過程obtainFreshBeanFactory詳解

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

1.refresh流程

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

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

obtainFreshBeanFactory重要流程

在這里插入圖片描述

3.必須了解的類

3.1 beanDefinition

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

3.2 NamespaceHandler

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

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

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中自定義的標簽。 接口需要實現(xiàn)BeanDefinition parse(Element element, ParserContext parserContext);方法,該方法返回一個beanDefination。但是實際都沒有處理這個返回值, 在parse內(nèi)部就解析beanDefination并注冊到beanDefinationMap中了。 實現(xiàn)類與節(jié)點名稱對應。

3.4 BeanDefinitionParser與ContextNamespaceHandler的關系

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

4.處理默認命名空間

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

5.處理非默認命名空間

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

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

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

1.掃描這個包下面的所有class。

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

如:含有@Component等注解的class

在這里插入圖片描述

6.debug的時候遇到的問題

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

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

7.整體流程

在這里插入圖片描述

8.其他

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

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

相關文章

  • JDBC連接SQL?Server數(shù)據(jù)庫實現(xiàn)增刪改查的全過程

    JDBC連接SQL?Server數(shù)據(jù)庫實現(xiàn)增刪改查的全過程

    實際開發(fā)中手動的輸入SQL語句是少之又少,大多數(shù)情況下是通過編譯代碼進行來控制自動執(zhí)行,下面這篇文章主要給大家介紹了關于JDBC連接SQL?Server數(shù)據(jù)庫實現(xiàn)增刪改查的相關資料,需要的朋友可以參考下
    2023-04-04
  • 詳解Java反射創(chuàng)建對象

    詳解Java反射創(chuàng)建對象

    今天帶大家學習Java的基礎知識,文中對Java反射創(chuàng)建對象作了非常詳細的介紹及代碼示例,對正在學習Java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • 在Java下利用log4j記錄日志的方法

    在Java下利用log4j記錄日志的方法

    本文先對log4j進行了簡短的介紹,而后通過安裝、配置和普通項目和web項目幾個方面來詳細介紹了在Java下利用log4j記錄日志的方法,有需要的朋友們可以參考借鑒。
    2016-09-09
  • 詳解static 和 final 和 static final區(qū)別

    詳解static 和 final 和 static final區(qū)別

    這篇文章主要介紹了static 和 final 和 static final區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Spring七大組件是哪些以及作用

    Spring七大組件是哪些以及作用

    這篇文章主要介紹了Spring七大組件是哪些以及作用,幫助剛接觸spring的朋友更快理解,如果有說的不對的地方還請指正,需要的朋友可以參考下
    2023-03-03
  • Dubbo+zookeeper搭配分布式服務的過程詳解

    Dubbo+zookeeper搭配分布式服務的過程詳解

    Dubbo作為分布式架構比較后的框架,同時也是比較容易入手的框架,適合作為分布式的入手框架,下面是簡單的搭建過程,對Dubbo+zookeeper分布式服務搭建過程感興趣的朋友一起看看吧
    2022-04-04
  • ssm框架Springmvc文件上傳實現(xiàn)代碼詳解

    ssm框架Springmvc文件上傳實現(xiàn)代碼詳解

    這篇文章主要介紹了ssm框架Springmvc文件上傳實現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot處理form-data表單接收對象數(shù)組的方法

    SpringBoot處理form-data表單接收對象數(shù)組的方法

    form-data則是一種更加靈活的編碼方式,它可以處理二進制數(shù)據(jù)(如圖片、文件等)以及文本數(shù)據(jù),這篇文章主要介紹了SpringBoot處理form-data表單接收對象數(shù)組,需要的朋友可以參考下
    2023-11-11
  • 使用Mybatis遇到的坑之Integer類型參數(shù)的解讀

    使用Mybatis遇到的坑之Integer類型參數(shù)的解讀

    這篇文章主要介紹了使用Mybatis遇到的坑之Integer類型參數(shù)的解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot 配置 okhttp3的操作

    SpringBoot 配置 okhttp3的操作

    這篇文章主要介紹了SpringBoot 配置 okhttp3的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論

巴林左旗| 巴彦县| 灵璧县| 永昌县| 宣武区| 汝阳县| 阳城县| 全椒县| 筠连县| 富裕县| 竹溪县| 朝阳县| 鹤壁市| 南部县| 凉山| 偏关县| 白玉县| 伊春市| 友谊县| 南汇区| 霍林郭勒市| 沙湾县| 淮南市| 陈巴尔虎旗| 竹山县| 通榆县| 兴和县| 息烽县| 古蔺县| 阜南县| 南皮县| 日照市| 桂东县| 阳高县| 卫辉市| 客服| 湘潭市| 辽阳市| 微山县| 辉县市| 汉寿县|