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

Spring中的NamespaceHandler與BeanDefinitionParser詳解

 更新時(shí)間:2023年12月01日 10:25:20   作者:thewindkee  
這篇文章主要介紹了Spring中的NamespaceHandler與BeanDefinitionParser詳解,由Spring啟動(dòng)過(guò)程之obtainFreshBeanFactory() ,可以看到NamespaceHandler、BeanDefinitionParser為解析配置文件中的Element起重要作用,那么它本身是如何被加載的呢,需要的朋友可以參考下

1.前文

由Spring啟動(dòng)過(guò)程之-obtainFreshBeanFactory()

可以看到NamespaceHandler、BeanDefinitionParser為解析配置文件中的Element起重要作用。

那么它本身是如何被加載的呢?

2.NamespaceHandler之ContextNamespaceHandler

常見(jiàn)的NamespaceHandler實(shí)例:ContextNamespaceHandler

很明顯能看出有常用的 context:annotation-config/、<context:component-scan base-package=“xx”/>、context:property-placeholder/對(duì)應(yīng)的解析類(lèi)。

在這里插入圖片描述

3.BeanDefinitionParser的作用

解析相關(guān)節(jié)點(diǎn),并注冊(cè)BeanDefinition。

3.1 PropertyPlaceholderBeanDefinitionParser

大致流程為解析<context:property-placeholder location="classpath:module.properties" />節(jié)點(diǎn),包裝PropertySourcesPlaceholderConfigurer為BeanDefinition,將里面的屬性裝配到BeanDefinition中,并注冊(cè)到BeanDefinitionMap。

PropertyPlaceholderBeanDefinitionParser#parse:
	AbstractBeanDefinitionParser->
		parseInternal->
			BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();//創(chuàng)建BeanDefinition
			...
			builder.getRawBeanDefinition().setBeanClass(PropertySourcesPlaceholderConfigurer.class);
			...
			doParse(element, parserContext, builder)->
				super.doParse(element, parserContext, builder);//解析公共屬性:location,fileEncoding等
				....//做特殊屬性的解析
			return builder.getBeanDefinition();
		//統(tǒng)一注冊(cè)
		registerBeanDefinition(holder, parserContext.getRegistry());

3.2 ComponentScanBeanDefinitionParser

解析節(jié)點(diǎn)<context:component-scan base-package="com.gkwind"/>本身。并根據(jù)其配置,做特殊的class掃描,將符合配置的class,如被@Component標(biāo)記過(guò)的類(lèi) 包裝成BeanDefinition,注入到BeanDefinitionMap中。 注意這里做的工作是根據(jù)配置,掃描加載了配置對(duì)應(yīng)的多個(gè)類(lèi)

ComponentScanBeanDefinitionParser#parse流程

在這里插入圖片描述

NamespaceHandler 加載過(guò)程

跟蹤源碼, 可以發(fā)現(xiàn)解析非自定義命名空間parseCustomElement時(shí)會(huì)調(diào)用DefaultNamespaceHandlerResolver#resolve,然后resolve得到的所有NamespaceHandler。之后得到命名空間對(duì)應(yīng)的NamespaceHandler 再NamespaceHandler#init初始化相關(guān)的parser。

getHandlerMappings以SPI的方式得到所有spring.handlers

在這里插入圖片描述

NamespaceHandler 加載流程

在這里插入圖片描述

作用:可實(shí)現(xiàn)自定義標(biāo)簽

知道了NamespaceHandler與BeanDefinitionParser作用后, 我們可以自定義schema,然后在spring的xml中自定義命名空間thewindkee標(biāo)簽<thewindkeetag>,再實(shí)現(xiàn)thewindkee對(duì)應(yīng)的NamespaceHandler與<thewindkeetag>的BeanDefinitionParser,最后將NamespaceHandler配置到META-INF/spring.handlers。

大致Java代碼:

class TheWindKeeNamespaceHandler  extends NamespaceHandlerSupport {
	public void init(){
     registerBeanDefinitionParser("thewindkeetag", new TheWindKeeTagBeanDefinitionParser());
	}
}
class TheWindKeeTagBeanDefinitionParser extends AbstractBeanDefinitionParser{
   public final BeanDefinition parse(Element element, ParserContext parserContext) {
		//解析element
		....
		//注冊(cè)BeanDefinition
		registerBeanDefinition(holder, parserContext.getRegistry());
	}
}

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

相關(guān)文章

  • bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索的實(shí)例

    bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索的實(shí)例

    下面小編就為大家?guī)?lái)一篇bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 關(guān)于Springboot打成JAR包后讀取外部配置文件的問(wèn)題

    關(guān)于Springboot打成JAR包后讀取外部配置文件的問(wèn)題

    這篇文章主要介紹了關(guān)于Springboot打成JAR包后讀取外部配置文件的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java使用nio2拷貝文件的示例

    java使用nio2拷貝文件的示例

    這篇文章主要介紹了java使用nio2拷貝文件的示例,需要的朋友可以參考下
    2014-04-04
  • Java回調(diào)方法詳解

    Java回調(diào)方法詳解

    本篇文章主要介紹了Java回調(diào)方法的步驟、回調(diào)的例子、異步回調(diào)與同步回調(diào)、回調(diào)方法在通信中的應(yīng)用等。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Java使用continue語(yǔ)句的實(shí)例詳解

    Java使用continue語(yǔ)句的實(shí)例詳解

    這篇文章主要介紹了Java使用continue語(yǔ)句的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家掌握使用方法,需要的朋友可以參考下
    2017-10-10
  • Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析

    Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析

    這篇文章主要介紹了Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Java?異常機(jī)制Exception和自定義異常

    Java?異常機(jī)制Exception和自定義異常

    這篇文章主要介紹了Java?異常機(jī)制Exception+自定義異常,異常分三種檢查性異常、運(yùn)行時(shí)異常、錯(cuò)誤ERROR,下文對(duì)其更多詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-05-05
  • 基于IntelliJ IDEA的類(lèi)注釋和方法注釋操作

    基于IntelliJ IDEA的類(lèi)注釋和方法注釋操作

    這篇文章主要介紹了基于IntelliJ IDEA的類(lèi)注釋和方法注釋操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Mybatis-plus apply函數(shù)使用場(chǎng)景分析

    Mybatis-plus apply函數(shù)使用場(chǎng)景分析

    Mybatis-plus 里面的 apply方法 是用于拼接自定義的條件判斷,自定義時(shí)間查詢,根據(jù)傳進(jìn)來(lái)的開(kāi)始日期,查詢所有該日期是數(shù)據(jù),但是數(shù)據(jù)庫(kù)中保存是時(shí)間,所以需要使用apply查詢方式并格式化,這篇文章給大家介紹Mybatis-plus apply函數(shù)使用,感興趣的朋友一起看看吧
    2024-02-02
  • ShardingSphere JDBC強(qiáng)制路由使用的項(xiàng)目實(shí)踐

    ShardingSphere JDBC強(qiáng)制路由使用的項(xiàng)目實(shí)踐

    在某些特定場(chǎng)景下,可能需要繞過(guò)分片規(guī)則直接定位到特定的數(shù)據(jù)庫(kù)或表,這種情況下就可以使用HintRouting,本文就來(lái)介紹一下ShardingSphere JDBC強(qiáng)制路由使用的項(xiàng)目實(shí)踐,感興趣的可以了解一下
    2024-06-06

最新評(píng)論