spring学习(三)——BeanDefinition的拼装(标签解析)

参考文章:

http://www.iocoder.cn

回到之前bean注册中说的标签解析地方,我们来看下标签具体是如何解析的。

//如果该节点使用默认命名空间,执行默认解析
					if (delegate.isDefaultNamespace(ele)) {
						parseDefaultElement(ele, delegate);
					}
					// 如果该节点非默认命名空间,执行自定义解析
					else {
						delegate.parseCustomElement(ele);
					}

根据上面代码可以看出来主要的解析方式有两种。

  • 如果根节点或者子节点采用默认命名空间的话,则调用 #parseDefaultElement(...) 方法,进行默认标签解析
  • BeanDefinitionParserDelegate#parseCustomElement(...) 方法,进行自定义解析

默认解析

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);
		}
	}

默认解析主要有

  • import
  • alias
  • bean
  • beans

自定义解析

@Nullable
	public BeanDefinition parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) {
		// 获取 namespaceUri
		String namespaceUri = getNamespaceURI(ele);
		if (namespaceUri == null) {
			return null;
		}
		// 根据 namespaceUri 获取相应的 Handler
		NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
		if (handler == null) {
			error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
			return null;
		}
		// 调用自定义的 Handler 处理
		return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
	}

 

  1. 调用 #getNamespaceURI((Node node) 方法,获取 namespaceUri
  2. 调用 XmlReaderContext#getNamespaceHandlerResolver() 方法,获得命名空间的解析器
  3. 调用 NamespaceHandlerResolver#resolve(String namespaceUri) 方法,根据 namespaceUri 获取相应的 Handler 对象。这个映射关系我们在 spring.handlers 中已经定义了
  4. 调用 NamespaceHandler#parse(Element element, ParserContext parserContext) 方法,调用自定义的 Handler 处理

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大·风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值