Spring源码之XML文件中Bean标签的解析2

读取XML文件,创建默认bean标签对象的核心代码

在DefaultBeanDefinitionDocumentReader类中的如下方法中:
	protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
		BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
		_________标注1
		if (bdHolder != null) {
			bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
					_________标注2
			try {
				// Register the final decorated instance.
				BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
				___________标注3
			}
			catch (BeanDefinitionStoreException ex) {
				getReaderContext().error("Failed to register bean definition with name '" +
						bdHolder.getBeanName() + "'", ele, ex);
			}
			// Send registration event.
			getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
			___________标注4
		}
	}
标注1——delegate.decorateBeanDefinitionIfRequired(ele, bdHolder)的作用
可以解析出如下标签

    
    
    

标注2——delegate.parseBeanDefinitionElement(ele)的作用——(非核心)
这是解析出bean中自定义的子标签(如果有的话)
比如:
解析
    
    

其中sjdwz就是自定义子标签。
标注3——BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry())
把解析好的BeanDefinition进行注册(注册的概念,实际上是存储);
那在哪完成注册呢?

Spring源码之XML文件中Bean标签的解析2_第1张图片

标注4——getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
send registion event
目的: BeanDefinition注册完成后,发送一个事件,如果需要扩展,则实现监听接口,默认空实现

自定义标签的解析过程

自定义标签举例
 
 
这些标签肯定对特定的类型。

在源码,spring-webmvc包的resource目录,有这两个文件:

spring.handlers——用来处理特殊的namespace,或者schema

spring.schemas

Spring源码之XML文件中Bean标签的解析2_第2张图片

这就是这个标签的定义。

我们在使用的时候,可以先引入xsd,在写这个标签。

Spring源码之XML文件中Bean标签的解析2_第3张图片

我们可以看到,他是被org.springframework.web.servlet.config.MvcNamespaceHandler类处理的

Spring源码之XML文件中Bean标签的解析2_第4张图片

这个类的定义如下

Spring源码之XML文件中Bean标签的解析2_第5张图片

这个类的作用就是注册一些类的BeanDefinition。

自己设计一个自定义标签

Spring源码之XML文件中Bean标签的解析2_第6张图片

自定义标签解析过程

通过handler----->Parser--------------->封装成BeanDefinition。

Spring源码之XML文件中Bean标签的解析2_第7张图片

你可能感兴趣的:(spring,xml,java)