• 【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值

  • 相关阅读:
    Vuex中mutations和actions的区别
    【PTE-day03 报错注入】
    1、SpringCloud大型企业分布式微服务云架构之Markdown 教程
    华为od机考题目-导师请吃火锅
    比Tensorflow还强?
    深度学习之基于YoloV5血红细胞检测识别系统
    Linux shell编程学习笔记26:stty(set tty)
    Autosar基本概念详细介绍
    分库分表索引设计:二级索引、全局索引的最佳设计实践
    2022实验室更新 DBCO-NH2,DBCO-Amine 叠氮化物功能化化合物
  • 原文地址:https://blog.csdn.net/aqin1012/article/details/126107412