• 【Spring源码】11. 我是注解类不?checkConfigurationClassCandidate()注解类判断方法详解


    checkConfigurationClassCandidate()方是用来检查给定的BeanDefinition是否是一个配置类的候选者(或一个在配置/组件类中声明的嵌套组件类),并对其进行相应的标记处理的

    第一步,当然是先获取bean定义信息中的class类名,不符合要求则直接返回false

    由于通过注解注入的BeanDefinition都是AnnotatedGenericBeanDefinition,实现了AnnotatedBeanDefinition,而Spring内部的BeanDefinition都是RootBeanDefinition,实现了AbstractBeanDefinition

    checkConfigurationClassCandidate()方法在获取到class类名以后,则先判断了是否实现了AnnotatedBeanDefinition(通过注解注入的BeanDefinition)

    再判断了是否实现了AbstractBeanDefinition(Spring内部的BeanDefinition)

    从上述代码可以看出,有4种类是不在此进行处理的(原因是什么? 欢迎了解的大佬指导.抱拳.gif):

    • BeanFactoryPostProcessor.class
    • BeanPostProcessor.class
    • AopInfrastructureBean.class
    • EventListenerFactory.class

    如果上述两种情况都不符合,就直接获取className的MetadataReader实例,取底层类的完整注解元数据

    处理完上述3种情况后,获取被@Configuration注解标注的Bean Definition的元数据属性的字典值

    • 如果字典值为proxyBeanMethods的属性值为false且被@Configuration注解修饰,则将其configurationClass属性值设为full
    • 如果是被isConfigurationCandidate()方法中列出的注解修饰,则将其configurationClass属性值设为lite

    isConfigurationCandidate()详解

    检查是否被特定注解修饰,这里的特定的包含4个:

    • Component.class
    • ComponentScan.class
    • Import.class
    • ImportResource.class

    关于"full" & "lite"

    • "full"用于修饰@Configuration注解修饰的注解类
    • "lite"用于修饰非@Configuration注解修饰的注解类

    最后,设置bean的order值

  • 相关阅读:
    【文件I/O】标准IO:库函数
    R语言 数据的整理与清洗(Data Frame 篇下)
    151. 关于 SAP UI5 XML 视图里控件事件处理函数名称中的 . (点号) 问题的讨论
    dubbo-无法找到提供者问题(一)
    利用NVIDIA GPU将Minecraft场景渲染成真实场景
    spring cloud nacos服务搭建
    测试面经 | 从测试螺丝钉到大厂测试开发,三点成长心得和面试经验
    在pycharm中导入sklearn库失败到成功
    Linux安装Tomcat
    MySQL-函数
  • 原文地址:https://blog.csdn.net/aqin1012/article/details/126107412