spring bean definition reader - hanyong/note GitHub Wiki
spring bean 定义读取
Spring bean 定义是 Spring 容器的元信息,描述如何创建和组装 bean。
java 编程设置 bean 定义时推荐使用 GenericBeanDefinition
,支持设置 parent 共享复用配置(?)。
RootBeanDefinition
表示最终呈现的 bean 定义。
XML 格式 bean 定义
跟踪 XmlBeanDefinitionReader
代码,
其调用到 XmlBeanDefinitionReader.registerBeanDefinitions(Document, Resource)
,
最终调用到:
BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element, String, BeanDefinition)
- 最终调用
BeanDefinitionReaderUtils.createBeanDefinition()
创建GenericBeanDefinition
。 - 解析 XML 填充相关信息,包装为 BeanDefinitionHolder。
之后返回到:
DefaultBeanDefinitionDocumentReader.processBeanDefinition(Element, BeanDefinitionParserDelegate)
/**
* Process the given bean element, parsing the bean definition
* and registering it with the registry.
*/
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
if (bdHolder != null) {
bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
try {
// Register the final decorated instance.
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
}
catch (BeanDefinitionStoreException ex) {
getReaderContext().error("Failed to register bean definition with name '" +
bdHolder.getBeanName() + "'", ele, ex);
}
// Send registration event.
getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
}
}
- 调用
BeanDefinitionReaderUtils.registerBeanDefinition
注册 bean 定义, 其最终调用BeanDefinitionRegistry.registerBeanDefinition(String, BeanDefinition)
。 - 调用
getReaderContext().fireComponentRegistered()
发送事件。getReaderContext()
为 XmlReaderContext。