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

发布时间 2023-08-07 00:29:44作者: 随机的未知

读取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)的作用
可以解析出如下标签
<bean id="" class="" scope="" abstract="" parent="" depend-on>
    <property
    <construtor-args>
    <lookup-method>
    <replace-method>
</bean>
标注2——delegate.parseBeanDefinitionElement(ele)的作用——(非核心)
这是解析出bean中自定义的子标签(如果有的话)
比如:
解析<bean标签内部存在自定义标签
<bean id="" class="" scope="">
    <property name="" value=""/>
    <sjdwz:text />
</bean>
其中sjdwz就是自定义子标签。
标注3——BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry())
把解析好的BeanDefinition进行注册(注册的概念,实际上是存储);
那在哪完成注册呢?

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

自定义标签的解析过程

自定义标签举例
<mvc:annotation-driven  /> 
<context:component-scan /> 
这些标签肯定对特定的类型。

<mvc:annotation-driven />

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

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

spring.schemas

这就是这个标签的定义。

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

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

处理的handler

这个类的定义如下

MvcNamespaceHandler

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

自己设计一个自定义标签

自定义标签设计

自定义标签解析过程

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