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

Spring配置文件解析之BeanDefinitionDocumentReader詳解

 更新時間:2024年02月14日 08:42:20   作者:軍偉@  
這篇文章主要介紹了Spring配置文件解析之BeanDefinitionDocumentReader詳解,Spring的xml配置文件解析成Document對象,接下來的解析處理工作是在BeanDefinitionDocumentReader中對Document對象進行解析,需要的朋友可以參考下

Spring中的BeanDefinitionDocumentReader

上一篇Spring配置文件解析之BeanDefinitionReader詳解中我們已經了解到BeanDefinitionReader已經將Spring的xml配置文件解析成Document對象了,接下來的解析處理工作是在BeanDefinitionDocumentReader中對Document對象進行解析工作了。

BeanDefinitionDocumentReader接口及其實現類:

BeanDefinitionDocumentReader提供的方法:

public interface BeanDefinitionDocumentReader {
 
	void registerBeanDefinitions(Document doc, XmlReaderContext readerContext)
			throws BeanDefinitionStoreException;
 
}

在 BeanDefinitionDocumentReader的實現類DefaultBeanDefinitionDocumentReader定義了對一些xml配置文件基本的元素的解析處理操作

在這里我們可能會有一個疑問,在Spring的xml配置文件中經??吹降腶op等相關的配置是在什么地方解析處理的,其實他們都是通過NamespaceHandler實現類來完成的,接下來我們會對其進行詳細的介紹。

在DefaultBeanDefinitionDocumentReader的registerBeanDefinitions方法中開始對Document進行解析。

	@Override
	public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
		this.readerContext = readerContext;
		logger.debug("Loading bean definitions");
		Element root = doc.getDocumentElement();
		doRegisterBeanDefinitions(root);
	}

在doRegisterBeanDefinitions中會創(chuàng)建BeanDefinitionParserDelegate來對Document進行解析

protected void doRegisterBeanDefinitions(Element root) {
		
		BeanDefinitionParserDelegate parent = this.delegate;
		//創(chuàng)建BeanDefinitionParserDelegate,真正xml中各種元素的解析
		this.delegate = createDelegate(getReaderContext(), root, parent);
 
		if (this.delegate.isDefaultNamespace(root)) {
			String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
			if (StringUtils.hasText(profileSpec)) {
				String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
						profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
				if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {
					if (logger.isInfoEnabled()) {
						logger.info("Skipped XML bean definition file due to specified profiles [" + profileSpec +
								"] not matching: " + getReaderContext().getResource());
					}
					return;
				}
			}
		}
 
		preProcessXml(root);
		parseBeanDefinitions(root, this.delegate);
		postProcessXml(root);
 
		this.delegate = parent;
	}

在parseBeanDefinitions會對Node進行判斷,如果是上面配置默認解析的spring標簽,則會在DefaultBeanDefinitionDocumentReader中進行解析,否則的話就需要 BeanDefinitionParserDelegate來委派找到解析處理器。

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
		if (delegate.isDefaultNamespace(root)) {
			NodeList nl = root.getChildNodes();
			for (int i = 0; i < nl.getLength(); i++) {
				Node node = nl.item(i);
				if (node instanceof Element) {
					Element ele = (Element) node;
					if (delegate.isDefaultNamespace(ele)) {
						//默認的一些標簽在DefaultBeanDefinitionDocumentReader進行解析
						parseDefaultElement(ele, delegate);
					}
					else {
						//如果不是默認的就需要在通過委派模式來尋找解析處理器
						delegate.parseCustomElement(ele);
					}
				}
			}
		}
		else {
			//如果不是默認的就需要在通過委派模式來尋找解析處理器
			delegate.parseCustomElement(root);
		}
	}

在parseDefaultElement中會對一些默認的標簽import,alias,bean,beans標簽進行處理

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
		//解析import標簽
		if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
			importBeanDefinitionResource(ele);
		}
		//解析alias標簽
		else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
			processAliasRegistration(ele);
		}
		//解析bean標簽
		else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
			processBeanDefinition(ele, delegate);
		}
		//解析beans標簽,就是進行遞歸解析
		else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
			// recurse
			doRegisterBeanDefinitions(ele);
		}
	}
 

對bean標簽解析,最終還是在BeanDefinitionParserDelegate中對元素進行處理解析生成BeanDefinitionHolder,其實bean元素的解析的結果是一個BeanDefinition對象,其包含了所有的bean的屬性設置,processBeanDefinition中的BeanDefinitionReaderUtils的處理結果是將BeanDefinition注冊到BeanFactory中。

protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
		//最終還是在BeanDefinitionParserDelegate中進行元素解析
		//BeanDefinitionHolder是對BeanDefinition的封裝,包括BeanDefinition,beanName,aliases
		BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
		if (bdHolder != null) {
			bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
			try {
				//處理的操作是將bean的元數據BeanDifinition注冊到BeanFactory中
				BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
			}
			catch (BeanDefinitionStoreException ex) {
				getReaderContext().error("Failed to register bean definition with name '" +
						bdHolder.getBeanName() + "'", ele, ex);
			}
			// Send registration event.
			getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
		}
	}

總結

BeanDefinitionDocumentReader中也沒有對xml中的bean元素進行處理操作,其真正的處理操作是在BeanDefinitionParserDelegate中進行處理的,都是在為他人做嫁衣。

到此這篇關于Spring配置文件解析之BeanDefinitionDocumentReader詳解的文章就介紹到這了,更多相關Spring中的BeanDefinitionDocumentReader內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot集成pf4j實現插件開發(fā)功能的代碼示例

    SpringBoot集成pf4j實現插件開發(fā)功能的代碼示例

    pf4j是一個插件框架,用于實現插件的動態(tài)加載,支持的插件格式(zip、jar),本文給大家介紹了SpringBoot集成pf4j實現插件開發(fā)功能的示例,文中通過代碼示例給大家講解的非常詳細,需要的朋友可以參考下
    2024-07-07
  • mybatisPlus打印sql配置的四種方法

    mybatisPlus打印sql配置的四種方法

    MyBatis-Plus提供了多種方式來配置SQL打印功能,以便進行調試和性能分析,這篇文章主要介紹了mybatisPlus打印sql配置的四種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • Java爬蟲實現Jsoup利用dom方法遍歷Document對象

    Java爬蟲實現Jsoup利用dom方法遍歷Document對象

    本文主要介紹了Java爬蟲實現Jsoup利用dom方法遍歷Document對象,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Nacos服務注冊客戶端服務端原理分析

    Nacos服務注冊客戶端服務端原理分析

    這篇文章主要為大家介紹了Nacos服務注冊客戶端服務端原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • sonar-scanner連接sonarquebe7的sonar.java.binaries問題的解決方案

    sonar-scanner連接sonarquebe7的sonar.java.binaries問題的解決方案

    今天小編就為大家分享一篇關于sonar-scanner連接sonarquebe7的sonar.java.binaries問題的解決方案,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 基于Nacos實現SpringBoot動態(tài)定時任務調度

    基于Nacos實現SpringBoot動態(tài)定時任務調度

    本文主要介紹了在Spring Boot項目中使用Spring Scheduling實現定時任務,并通過Nacos動態(tài)配置Cron表達式實現任務的動態(tài)變更,通過實現SchedulingConfigurer接口和訂閱Nacos配置變更事件,成功實現了任務的動態(tài)調度和暫停
    2025-11-11
  • JAVA用戶自定義事件監(jiān)聽實例代碼

    JAVA用戶自定義事件監(jiān)聽實例代碼

    這篇文章主要介紹了JAVA用戶自定義事件監(jiān)聽實例代碼的相關資料,需要的朋友可以參考下
    2017-04-04
  • Java zxing生成條形碼和二維嗎代碼實例

    Java zxing生成條形碼和二維嗎代碼實例

    這篇文章主要介紹了java zxing生成條形碼和二維嗎代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • IDEA2020.2.3

    IDEA2020.2.3 "reading maven projects"卡住的問題

    這篇文章主要介紹了IDEA2020.2.3 "reading maven projects"卡住的問題及問題原因探究,通過多種方法給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-10-10
  • IDEA 插件 mapper和xml互相跳轉操作

    IDEA 插件 mapper和xml互相跳轉操作

    這篇文章主要介紹了IDEA 插件 mapper和xml互相跳轉操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論

娄烦县| 柳林县| 霍州市| 洛浦县| 溧水县| 新乡市| 双城市| 缙云县| 霍邱县| 通河县| 普安县| 达孜县| 东乡县| 左权县| 汉阴县| 郸城县| 安平县| 青神县| 枣庄市| 本溪市| 枣阳市| 祁连县| 商丘市| 南郑县| 临朐县| 九龙坡区| 兰考县| 临泽县| 黄石市| 石屏县| 永春县| 恩施市| 大竹县| 遵义县| 定州市| 平泉县| 利津县| 平阳县| 临湘市| 香格里拉县| 博罗县|