Spring 源码阅读 08:加载 BeanDefinition 的过程(解析阶段)

本文详细介绍了Spring框架中BeanDefinition的解析过程,从BeanDefinitionDocumentReader的创建到BeanDefinition的生成,涉及XML文档中标签的匹配逻辑、元素信息解析,以及如何将这些信息注册到Spring容器。文章深入分析了源码,揭示了Spring如何处理bean标签及其属性和子标签,帮助读者理解Spring IoC容器的核心工作原理。
摘要由CSDN通过智能技术生成

BeanDefinition 的解析

下面从int count = registerBeanDefinitions(doc, resource)这行代码入手,先找到registerBeanDefinitions方法的源码:

public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
   BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
   int countBefore = getRegistry().getBeanDefinitionCount();
   documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
   return getRegistry().getBeanDefinitionCount() - countBefore;
}

下面罗列一下方法中的逻辑:

  1. 创建一个 BeanDefinitionDocumentReader 对象documentReader
  1. 获取 Spring 容器中已经注册的 BeanDefinition 的数量
  1. 调用documentReaderregisterBeanDefinitions方法,初步分析这里完成了解析和向容器中注册 BeanDefinition 的过程。
  1. 通过简单运算得到本次注册的 BeanDefinition 的数量并返回。

这里主要关注一下步骤1和3。

documentReader的创建

首先简单看一下documentReader是如何创建的:

protected BeanDefinitionDocumentReader createBeanDefinitionDocumentReader() {
   return BeanUtils.instantiateClass(this.documentReaderClass);
}
private Class<? extends BeanDefinitionDocumentReader> documentReaderClass =
      DefaultBeanDefinitionDocumentReader.class;

这里从createBeanDefinitionDocumentReader方法和documentReaderClass成员变量的代码可以看出,这里通过反射创建了一个 DefaultBeanDefinitionDocumentReader 类型的对象。

下面再看最重要的registerBeanDefinitions方法:

@Override
public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
   this.readerContext = readerContext;
   doRegisterBeanDefinitions(doc.getDocumentElement());
}

BeanDefinitionParserDelegate的创建

这里看到了一个名为doXXX的方法调用,应该就是这部分的核心逻辑了,这里传入的参数是doc.getDocumentElement(),代表的是 XML 文件中的beans标签。查看方法源码:

 /**
* Register each bean definition within the given root {  @code  <beans/>} element.
*/
@SuppressWarnings("deprecation")  // for Environment.acceptsProfiles(String...)
protected void doRegisterBeanDefinitions(Element root) {
   // Any nested <beans> elements will cause recursion in this method. In
   // order to propagate and preserve <beans> default-* attributes correctly,
   // keep track of the current (parent) delegate, which may be null. Create
   // the new (child) delegate with a reference to the parent for fallback purposes,
   // then ultimately reset this.delegate back to its original (parent) reference.
   // this behavior emulates a stack of delegates without actually necessitating one.
   BeanDefinitionParserDelegate parent = this.delegate;
   this.delegate = createDelegate(getReaderContext(), root, par
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值