十二、解析自定义标签一

解析自定义标签一

默认标签的解析过程:

DefaultBeanDefinitionDocumentReader 的 processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) 方法,负责 bean 标签的解析:

  • 在解析过程中,首先调用 BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele) 方法,完成默认标签的解析。
  • 如果解析成功(返回的 bdHolder != null ),则调用 BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired(Element ele, BeanDefinitionHolder definitionHolder) 方法,完成自定义标签元素的解析。

decorateBeanDefinitionIfRequired()方法

该方法处理自定义标签的解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public BeanDefinitionHolder decorateBeanDefinitionIfRequired(Element ele, BeanDefinitionHolder originalDef) {
return decorateBeanDefinitionIfRequired(ele, originalDef, null);
}

public BeanDefinitionHolder decorateBeanDefinitionIfRequired(
Element ele, BeanDefinitionHolder originalDef, @Nullable BeanDefinition containingBd) {

BeanDefinitionHolder finalDefinition = originalDef;

// Decorate based on custom attributes first.
// <1> 遍历属性,查看是否有适用于装饰的【属性】
NamedNodeMap attributes = ele.getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
Node node = attributes.item(i);
finalDefinition = decorateIfRequired(node, finalDefinition, containingBd);
}

// Decorate based on custom nested elements.
// <2> 遍历子节点,查看是否有适用于修饰的【子节点】
NodeList children = ele.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node node = children.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
finalDefinition = decorateIfRequired(node, finalDefinition, containingBd);
}
}
return finalDefinition;
}

<1><2> 处,都是遍历,前者遍历的是属性( attributes ),后者遍历的是子节点( childNodes ),最终调用的都是 #decorateIfRequired(Node node, BeanDefinitionHolder originalDef, BeanDefinition containingBd) 方法,装饰对应的节点( Node )。

decorateIfRequired()方法

decorateBeanDefinitionIfRequired()方法中分别遍历了属性子节点后,都会执行该方法进行对应节点(Node)的装饰。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public BeanDefinitionHolder decorateIfRequired(
Node node, BeanDefinitionHolder originalDef, @Nullable BeanDefinition containingBd) {

// <1> 获取自定义标签的命名空间
String namespaceUri = getNamespaceURI(node);
// <2> 过滤掉默认命名标签
if (namespaceUri != null && !isDefaultNamespace(namespaceUri)) {
// <2> 获取相应的处理器
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
if (handler != null) {
//如果处理器存在,进行装饰处理
BeanDefinitionHolder decorated =
handler.decorate(node, originalDef, new ParserContext(this.readerContext, this, containingBd));
if (decorated != null) {
return decorated;
}
}
else if (namespaceUri.startsWith("http://www.springframework.org/schema/")) {
error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", node);
}
else {
// A custom namespace, not to be handled by Spring - maybe "xml:...".
if (logger.isDebugEnabled()) {
logger.debug("No Spring NamespaceHandler found for XML schema namespace [" + namespaceUri + "]");
}
}
}
return originalDef;
}

十二、解析自定义标签一
http://www.muzili.ren/2022/06/11/解析自定义标签/
作者
jievhaha
发布于
2022年6月11日
许可协议