在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
}
}
可以解析出如下标签
<bean id="" class="" scope="" abstract="" parent="" depend-on>
<property
<construtor-args>
<lookup-method>
<replace-method>
</bean>
这是解析出bean中自定义的子标签(如果有的话)
比如:
解析<bean标签内部存在自定义标签
<bean id="" class="" scope="">
<property name="" value=""/>
<sjdwz:text />
</bean>
其中sjdwz就是自定义子标签。
把解析好的BeanDefinition进行注册(注册的概念,实际上是存储);
send registion event
目的: BeanDefinition注册完成后,发送一个事件,如果需要扩展,则实现监听接口,默认空实现
自定义标签举例
<mvc:annotation-driven />
<context:component-scan />
这些标签肯定对特定的类型。
在源码,spring-webmvc包的resource目录,有这两个文件:
spring.handlers——用来处理特殊的namespace,或者schema
spring.schemas
这就是这个标签的定义。
我们在使用的时候,可以先引入xsd,在写这个标签。
我们可以看到,他是被org.springframework.web.servlet.config.MvcNamespaceHandler类处理的
这个类的定义如下
这个类的作用就是注册一些类的BeanDefinition。
通过handler----->Parser--------------->封装成BeanDefinition。