zoukankan      html  css  js  c++  java
  • Spring IOC 之注册解析的 BeanDefinition

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

    解析工作分为三步:

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

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

    f5db96553ef7387afe1b674e6d97c0c2c5d.jpg

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

    通过 beanName 注册

    处理过程如下:

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

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

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

    注册 alias

    • BeanDefinitionRegistry.registerAlias 完成 alias 的注册
    • 注册 alias 和注册 BeanDefinition 的过程差不多。在最好调用了 checkForAliasCircle() 来对别名进行了检测

    转载于:https://my.oschina.net/u/3847203/blog/2251340

  • 相关阅读:
    redis:高可用分析
    mysql:explain分析sql
    python中注意事项(更新)
    jupyter使用小技巧(更新)
    Jupyter中的快捷键
    Excel制作甘特图
    Vim编辑器常用命令
    Mysql主从
    常用MySql命令
    进程与线程的一个简单解释
  • 原文地址:https://www.cnblogs.com/twodog/p/12135751.html
Copyright © 2011-2022 走看看