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解析给定的 ElementParserContextBean 定义相关的上下文,封装了相关的配置和状态,内部嵌套了一个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>();