承载spring配置的类AbstractBeanDefinition
对于这个类的讲解,spring源码深度解析一书中已解释的十分详尽精辟。
文章摘要(摘自《spring源码深度解析》:
BeanDefinition 个接口,在 Spring 中存在三种实现: RootBeanDefinition ChildBeanDefinition 以及 GenericBeanDefinition。 三种实现均继承了 AbstractBeanDefiniton,其中 BeanDefinition 是配置文件<bean>元素标签在容器中的内部表示形式 < bean>元素标签拥有 class、 scope、 lazy-init 等配置属性, BeanDefinition 则提供了相应的 beanClass 、scope、 lazyInit 属性, BeanD finition 和< bean>中的属性是一一对应的 RootBeanDefinition 是最常用的实现类,它对应一般性的<bean>元素标签, GenericB anDefinition 是自 2.5 版本以后新加入的 bean 文件配置属性定义类,是一站式服务类。
在配置文件中可以定义父<bean >和子<bean >,父<bean>用 RootBeanDefinition 表示,而子 < bean>用 ChildBeanDefiniton 表示,而没有父<bean > 的 < bean>就使用 RootBeanDefinition 表示。 AbstractBeanDefinition 对两者共同的类信息进行抽象。
Spring 通过 BeanDefinition 将配置文件中的<bean >配置信息转换为容器的内部表示,并将 这些 BeanDefiniton 注册到 BeanDefinitonRegistry中。 Spring 容器的 BeanDefinitionRegistrγ 就像是Spring 配置信息的内存数据库,主要是以 map 的形式保存,后续操作直接从BeanDefinitionRegistry 中读取配置信息。
这是该类的属性,大部分都是spring的常用配置。
spring自定义标签的加载过程
自定义标签的使用:
文章摘要(摘自《spring源码深度解析》:
扩展 Spring 自定 义标签配置大致需要以下几个步骤(前提是要把 Spring Cor巳包加入项目中)
- 创建一个需要扩展的组件
- 定义一个 XSD 文件描述组件内容
- 创建一个文件,实现 BeanDefinitionParser 接口,用来解析 XSD 文件中的定义和组件定义
- 创建一个 Handler 文件,扩展自 NamespaceHandlerSupport ,目的是将组件注册到 Spring 容器
- 编写 Spring.handlers 和Spring.schemas 文件
核心代码:
BeanDefinitionParserDelegate.parseCustomElement(Element ele, @Nullable BeanDefinition containingBd)
@Nullable
public BeanDefinition parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) {
//获取命名空间
String namespaceUri = getNamespaceURI(ele);
if (namespaceUri == null) {
return null;
}
// 使用命名空间解析器,从META-INF目录下加载spring.handlers文件,文件中存储这自定义命名空间和其对应的自定义处理器
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
if (handler == null) {
error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
return null;
}
// 调用自定义处理器的解析方法
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}