解析@Component @Bean @Import 源码【接上篇第一章】

解析@Component @Bean @Import 源码


文章目录

  • 解析@Component @Bean @Import 源码
  • 前言
  • 一、@Component
  • 二、@Bean
  • 三、@Import(重点)
  • 总结


前言

上篇讲解了ConfigurationClassPostProcessor类的两个方法,在第一篇中分析了@ComponentScan的源码 ,这一篇收下尾巴。


一、@Component

定位到ConfigurationClassParser类的doProcessConfigurationClass方法
解析@Component @Bean @Import 源码【接上篇第一章】_第1张图片
首先判断是否加了@Component注解 加了后进入processMemberClasses方法

解析@Component @Bean @Import 源码【接上篇第一章】_第2张图片
这里主要找内部类 如果找不到 则不会处理

二、@Bean

其实这里处理就是找到类中加了@Bean注解的方法 并把方法当作属性set到类中,代码如下
解析@Component @Bean @Import 源码【接上篇第一章】_第3张图片
this.beanMethods 为Set集合
解析@Component @Bean @Import 源码【接上篇第一章】_第4张图片

三、@Import(重点)

这里声明下环境 在C类上加@Import注解 D什么也没实现 E F分别如下图所示
解析@Component @Bean @Import 源码【接上篇第一章】_第5张图片
解析@Component @Bean @Import 源码【接上篇第一章】_第6张图片
解析@Component @Bean @Import 源码【接上篇第一章】_第7张图片解析@Component @Bean @Import 源码【接上篇第一章】_第8张图片

环境到此结束 开始源码解析

在这里插入图片描述

  1. 点进来后,先分析什么都不加的D.class

解析@Component @Bean @Import 源码【接上篇第一章】_第9张图片
又再次进入到递归中。。。 这里只是普通的Class 所以会递归完后加入configurationClasses 中 如下图:
解析@Component @Bean @Import 源码【接上篇第一章】_第10张图片
然后随着其它import 类 执行完成后 则继续主流程,主流程中处理了 也把D.class 变成了beanDef,如下面流程:

在这里插入图片描述
先将configurationClasses 中的值放到Set集合中,然后再用reader将符合条件的候选类解析成beanDef,如下图:
解析@Component @Bean @Import 源码【接上篇第一章】_第11张图片

图中的方法都比较重要,也是@Bean后续处理流程,先看import的,@Bean的自己看一下
解析@Component @Bean @Import 源码【接上篇第一章】_第12张图片
看到这里大家明白了吧
2. 解析实现ImportSelector 也就是分析F
解析@Component @Bean @Import 源码【接上篇第一章】_第13张图片
红圈上面代码为 实例化出来 并为各种Aware接口赋值 以及看下是否为DeferrerImportSelector 是否延迟import,接下来讲正常逻辑,也就是第二个红圈的代码,这里又是递归import 其实还是走D.class那个流程

  1. import实现了ImportBeanDefinitionRegistrar接口的类
    解析@Component @Bean @Import 源码【接上篇第一章】_第14张图片

这里只是把类加入到importBeanDefinitionRegistrars中 在往下执行过程中 继续执行 定位过去,是不是有点似曾相识

解析@Component @Bean @Import 源码【接上篇第一章】_第15张图片
在这里插入图片描述
点进去后调用自己写的逻辑 对registry进行定制 比如说增加beanDefinition remove等操作 至此解析完成!

总结

其中比较重要的为Import 以及未讲解到的DeferredImportSelector接口 大家可以自己看看,其实就是执行时机不一样

你可能感兴趣的:(java,spring,开发语言)