• 【Spring源码】10. 递归调用的processConfigurationClass()方法


    shouldSkip()

    先通过conditionEvaluator条件计算器判断是否跳过当前解析

    shouldSkip()中执行具体的判断逻辑

    asSourceClass ( configClass, filter )

    处理配置类

    • 由于配置类可能存在父类(若父类的全类名是以java开头的,则除外?)
    • configClass如果存在父类,则需要将configClass变成sourceClass去解析,然后返回sourceClass的父类
    • 父类为空则不会进行while循环解析,如果父类不为空,则会循环的去解析父类
    • sourceClass是一个简单的包装类

      • 为了以统一的方式去处理带有注解的类,不管这些类是如何加载的

    解析各种注解、doProcessConfigurationClass ()

    进入该方法

    递归处理内部类、processMemberClasses()

    此处对processConfigurationClass()方法进行了递归调用(扣题)

    处理被@PropertySource注解修饰的类、processPropertySource ()

    解析加载properties文件,并将属性添加到spring上下文中

    processPropertySource ( propertySource )

    进入上图所示addPropertySource ()方法

    添加属性资源、addPropertySource ()

    解析被@ComponentScan/@ComponentScans注解修饰的包及其子包下的类为类定义、parse()

    进入解析方法:

    1. 先创建了一个扫描类
    1. 依次获取@ComponentScan的相关属性为刚刚创建的扫面类赋值

      1. nameGenerator
      2. scopedProxy
      3. resourcePattern
      4. includeFilters
      5. excludeFilters
      6. lazyInit
    1. 将要扫描的包统一放入集合中
    1. 使用创建并设置好参数的扫描器处理这个集合(scanner.doScan()

    doScan()

    在这个方法中,将上一个方法中放置需要扫描的包的集合传入创建好的扫描器进行处理,注册符合要求的BeanDefinition

    registerBeanDefinition ()

    注册BeanDefinition

    处理@Import注解、processImports()

    由于被import的类也有可能被@Import注解修饰,于是采用了递归处理

    处理@ImportResource注解

    处理@Bean注解

    处理接口的默认方法实现

    jdk8开始,接口中的方法可以有自己的默认实现,所以如果这个接口的方法加了@Bean注解,也需要被解析

    解析父类

    将解析的配置类存储起来

    这样当返回到parse()方法时,也能取到值(╯﹏╰)


    作者:AQin1012
    链接:https://juejin.cn/post/7125730881658388493
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    【数学建模】历年数学建模国赛评价类题目汇总
    【MyBatis】MyBatis的前世今生与环境搭建
    小程序商城深度运营方案及众筹案例分享
    【STM32】定时器
    整形数据和浮点型数据在内存中的存储差别
    上周热点回顾(5.6-5.12)
    206、3分钟学会路由器的无线桥接,超实用
    快让Live2D小可爱住进你的网站吧
    Spring原理学习(五)初始化与销毁
    正厚技术 | Jmeter分布式设置操作说明
  • 原文地址:https://blog.csdn.net/aqin1012/article/details/126107551