source: category: Spring Framework tag: Java spring-framework time: 2020-12-15 14:08:43

DefaultBeanDefinitionDocumentReader 使用的基础的接口定义,用来处理自定义的 Spring XML configuration file。

  • 返回一个 BeanDefinitionParser 接口的实现来解析自定义的顶层 tags
  • 返回一个 BeanDefinitionDecorator 接口的实现来解析自定义嵌套的 tags

当解析器在遇到 beans 标签下的自定义标签,或者 bean 下定义的自定义标签时,会调用 parse 方法。

开发者在自定义标签是可以不用直接实现 NamespaceHandler 接口,而是使用 Spring 提供的抽象实现 NamespaceHandlerSupport 来扩展。

接口定义

接口方法定义:

init
parse
decorate

init

init 方法会在 DefaultBeanDefinitionDocumentReader 构造后被调用,但是会在解析任何自定义标签之前调用。

parse

parse 方法接受两个参数

  • Element 解析给定的 Element
  • ParserContext Bean 定义相关的上下文,封装了相关的配置和状态,内部嵌套了一个 XmlReaderContext

parse 方法有一个 BeanDefinition 返回值。

decorate

参数:

  • Node: Node 可以是 org.w3c.dom.Attr 或者 Element,传入的Node 是即将被解析的元素
  • BeanDefinitionHolder 当前 Bean 的定义
  • parserContext 封装了当前解析的状态

返回值是 BeanDefinitionHolder,会被注册到 BeanFactory 中

NamespaceHandlerSupport

抽象类 NamespaceHandlerSupport 实现 NamespaceHandler

public abstract class NamespaceHandlerSupport implements NamespaceHandler 

NamespaceHandlerSupport 类中保存了解析器 Map

private final Map<String, BeanDefinitionParser> parsers =
			new HashMap<String, BeanDefinitionParser>();
private final Map<String, BeanDefinitionDecorator> decorators =
			new HashMap<String, BeanDefinitionDecorator>();
private final Map<String, BeanDefinitionDecorator> attributeDecorators =
			new HashMap<String, BeanDefinitionDecorator>();