Spring IOC 之注册解析的 BeanDefinition

DefaultBeanDefinitionDocumentReader.processBeanDefinition() 完成 Bean 标签解析的核心工做:缓存

解析工做分为三步:并发

  1. 解析默认标签;
  2. 解析默认标签后下得自定义标签;
  3. 注册解析后的 BeanDefinition。

注册 BeanDefinition 由 BeanDefinitionReaderUtils.registerBeanDefinition() 完成:ide

  • 首先经过 beanName 注册 BeanDefinition ,而后再注册别名 alias
  • BeanDefinition 的注册由接口 BeanDefinitionRegistry 定义

经过 beanName 注册this

处理过程以下:code

  • 首先 BeanDefinition 进行校验,该校验也是注册过程当中的最后一次校验了,主要是对 AbstractBeanDefinition 的 methodOverrides 属性进行校验
  • 根据 beanName 从缓存中获取 BeanDefinition,若是缓存中存在,则根据 allowBeanDefinitionOverriding 标志来判断是否容许覆盖,若是容许则直接覆盖,不然抛出 BeanDefinitionStoreException 异常
  • 若缓存中没有指定 beanName 的 BeanDefinition,则判断当前阶段是否已经开始了 Bean 的建立阶段(),若是是,则须要对 beanDefinitionMap 进行加锁控制并发问题,不然直接设置便可。对于 hasBeanCreationStarted() 方法后续作详细介绍,这里不过多阐述。
  • 若缓存中存在该 beanName 或者 单利 bean 集合中存在该 beanName,则调用 resetBeanDefinition() 重置 BeanDefinition 缓存。

其实整段代码的核心就在于 this.beanDefinitionMap.put(beanName, beanDefinition);blog

  • BeanDefinition 的缓存也不是神奇的东西,就是定义 map ,key 为 beanName,value 为 BeanDefinition

注册 alias接口

  • BeanDefinitionRegistry.registerAlias 完成 alias 的注册
  • 注册 alias 和注册 BeanDefinition 的过程差很少。在最好调用了 checkForAliasCircle() 来对别名进行了检测
相关文章
相关标签/搜索