spring 5.0.x源码学习系列三: AnnotationC

2021-03-19  本文已影响0人  avengerEug

前言

后续的所有文章将开始围绕上篇博客:spring 5.0.x源码学习系列二: 从AnnotationConfigApplicationContext开始,进入spring世界的运行流程图展开, 并根据实际的代码来详细解析。接下来开始进入正文

一、AnnotationConfigApplicationContext的无参构造方法

上篇博客(上面有链接, 可以自行查看)中,大致介绍了无参构造方法的主要作用, 接下来将根据源码详细介绍.

1.1 项目demo

项目结构非常简单,大致结构如下:


在这里插入图片描述
在这里插入图片描述 在这里插入图片描述

1.2 debug运行项目

1. 进入带参AnnotationConfigApplicationContext构造方法

在这里插入图片描述

2. 调用无参构造方法, 但因为继承了GenericApplicationContext类, 所以要先执行父类的无参构造方法, 此时实例化了bean工厂

在这里插入图片描述

3. bean工厂初始化完毕

在这里插入图片描述

4. 实例化AnnotationBeanDefinitionReader

在这里插入图片描述

5. AnnotationBeanDefinitionReader自己维护了spring的上下文, 并开始准备注册spring的6个内置bean

在这里插入图片描述

6. 重载方法

在这里插入图片描述

7. 从BeanDefinitionRegistry中获取bean工厂

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8. 注册spring的六个内置bean(这些bean的作用是后置处理器)

9. 后面还有5个内置bean需要注册, 注册方式跟第八步大同小异,都是先判断是否存在再创建RootBeanDefinition再注册到bean工厂, 这里就不累述了

10. spring内置6个bean注册完毕

在这里插入图片描述

11. this.scanner = new ClassPathBeanDefinitionScanner(this)

关于这行代码, 它是初始化一个ClassPath的扫描器, 它的作用是扫描@ComponentScan注解中提供的扫描路径, 但它并没有起到这个作用, 因为真正在解析@ComponentScan注解时, 是在内部新new了一个ClassPathBeanDefinitionScanner对象, 所以暂时没发现它有啥用, 先跳过它, 以后若发现它有其他作用再来补上

二、小结

  1. spring的bean工厂类: DefaultListableBeanFactory
  2. spring中最重要的内置bean: ConfigurationClassPostProcessor, 它的作用在refresh方法中会着重体现出来, 后续再总结
  3. BeanDefinition的定义: 描述spring bean的数据结构
  4. BeanDefinition的几种类型: RootBeanDefinitionAnnotatedGenericBeanDefinitionScannedGenericBeanDefinitionConfigurationClassBeanDefinition(配置类中方法中拥有@Bean注解的类会被定义成这个)
  5. spring上下文的几种身份: BeanDefinitionRegistryGenericApplicationContex
上一篇 下一篇

猜你喜欢

热点阅读