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)的作用
可以解析出如下标签
<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。

posted on   随机的未知  阅读(22)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效

导航

< 2025年3月 >
23 24 25 26 27 28 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
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示