Spring中的NamespaceHandler與BeanDefinitionParser詳解
1.前文
由Spring啟動過程之-obtainFreshBeanFactory()
可以看到NamespaceHandler、BeanDefinitionParser為解析配置文件中的Element起重要作用。
那么它本身是如何被加載的呢?
2.NamespaceHandler之ContextNamespaceHandler
常見的NamespaceHandler實例:ContextNamespaceHandler
很明顯能看出有常用的 context:annotation-config/、<context:component-scan base-package=“xx”/>、context:property-placeholder/對應(yīng)的解析類。

3.BeanDefinitionParser的作用
解析相關(guān)節(jié)點(diǎn),并注冊BeanDefinition。
3.1 PropertyPlaceholderBeanDefinitionParser
大致流程為解析<context:property-placeholder location="classpath:module.properties" />節(jié)點(diǎn),包裝PropertySourcesPlaceholderConfigurer為BeanDefinition,將里面的屬性裝配到BeanDefinition中,并注冊到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)一注冊 registerBeanDefinition(holder, parserContext.getRegistry());
3.2 ComponentScanBeanDefinitionParser
解析節(jié)點(diǎn)<context:component-scan base-package="com.gkwind"/>本身。并根據(jù)其配置,做特殊的class掃描,將符合配置的class,如被@Component標(biāo)記過的類 包裝成BeanDefinition,注入到BeanDefinitionMap中。 注意這里做的工作是根據(jù)配置,掃描加載了配置對應(yīng)的多個類
ComponentScanBeanDefinitionParser#parse流程

NamespaceHandler 加載過程
跟蹤源碼, 可以發(fā)現(xiàn)解析非自定義命名空間parseCustomElement時會調(diào)用DefaultNamespaceHandlerResolver#resolve,然后resolve得到的所有NamespaceHandler。之后得到命名空間對應(yīng)的NamespaceHandler 再NamespaceHandler#init初始化相關(guān)的parser。
getHandlerMappings以SPI的方式得到所有spring.handlers

NamespaceHandler 加載流程

作用:可實現(xiàn)自定義標(biāo)簽
知道了NamespaceHandler與BeanDefinitionParser作用后, 我們可以自定義schema,然后在spring的xml中自定義命名空間thewindkee標(biāo)簽<thewindkeetag>,再實現(xiàn)thewindkee對應(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
....
//注冊BeanDefinition
registerBeanDefinition(holder, parserContext.getRegistry());
}
}到此這篇關(guān)于Spring中的NamespaceHandler與BeanDefinitionParser詳解的文章就介紹到這了,更多相關(guān)NamespaceHandler與BeanDefinitionParser內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中集成IP2Region實現(xiàn)高效IP地址地理位置查詢
IP2Region是一個高效的IP地址地理位置查詢庫,能夠快速根據(jù)IP地址獲取其地理位置信息,它支持IPv4和IPv6地址的查詢,并提供多種緩存方式來優(yōu)化查詢性能,在這篇博客中,我們將介紹如何將IP2Region集成到SpringBoot項目中,實現(xiàn)IP地址的地理位置查詢服務(wù)2025-12-12
java中以DES的方式實現(xiàn)對稱加密并提供密鑰的實例
這篇文章主要介紹了java中以DES的方式實現(xiàn)對稱加密并提供密鑰的實例的相關(guān)資料,這里提供實例幫助大家學(xué)習(xí)理解這部分知識,需要的朋友可以參考下2017-08-08
Java中ClassNotFoundException的類加載問題排查與修復(fù)方法
在Java開發(fā)中,java.lang.ClassNotFoundException是常見的運(yùn)行時異常,通常表示JVM在嘗試加載某個類時未能找到其定義,本文結(jié)合實戰(zhàn)經(jīng)驗,系統(tǒng)性分析ClassNotFoundException的排查與修復(fù)方法,并提供豐富的代碼示例和表格分析,需要的朋友可以參考下2025-06-06

