前言

在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程。

入口

从 JavaConfig 中加载配置的 AnnotationConfigApplicationContext 启动方式如下:

进去之后发现构造其实是调用的当前无参构造。

所以在启动时也可以直接声明无参构造,改写为下面这种:

public class AnnotationConfigApplicationTest {

	public static void main(String[] args) {

		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();

		context.register(JavaConfig.class);
context.refresh(); System.out.println(context.getBean(UserComponent.class)); }
}

今天就研究研究无参构造这一部分究竟做了什么逻辑!

无参构造

其中的 StartupStep 是 5.3 新增的类,看代码注释的意思是:表示用来记录启动过程中的一些指标信息等。暂时不做研究。

主要研究红框部分!注意,这一块并不代表只有红框部分

因为 AnnotationConfigApplicationContext 继承了 GenericApplicationContext,所以会先执行父类的构造方法。

所以这里会创建一个 DefaultListableBeanFactory 的容器。

DefaultListableBeanFactory

虽然说 Spring 的 BeanFactory 定义了容器的基础概念、接口方法等,但是 DefaultListableBeanFactory 才是一个真正可以 new 出来的具体的容器,当然也可以暂且称之为 bean 工厂。

下面来看一下 DefaultListableBeanFactory 里面都有什么?

DefaultListableBeanFactory 里面会初始化很多参数,其中重点关注的是下面两个参数:

/** Map of bean definition objects, keyed by bean name. */
// BeanDefinition 的存储 Map 其中 key 为 beanName
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256); /** List of bean definition names, in registration order. */
// BeanName 的集合
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);

其中 BeanDefinition 描述了一个 bean 实例,该实例具有属性值,构造函数参数值以及具体实现所提供的更多信息。

对应的 beanDefinitionMap 就是存储的初始化的 beanName 和 BeanDefinition。

至于 BeanDefinition 具体内容,下一节再做介绍。

总结

通过上面的阅读,可以在初始化流程中增加一部分模块,即实例化 DefaultListableBeanFactory

再回顾一下 DefaultListableBeanFactory 的概念。

DefaultListableBeanFactory:

Spring 的 ConfigurableListableBeanFactory 和 BeanDefinitionRegistry 接口的默认实现:基于bean定义元数据的成熟bean工厂,可通过后处理器进行扩展。

重点需要把握的是 DefaultListableBeanFactory 内部定义了 BeanDefinition 的 Map。

结束语

本文从入口开始,进入到构造,主要介绍了 DefaultListableBeanFactory 的创建,及创建时初始化了一堆参数。

考虑到文章篇幅问题,尽量避免大段大段的贴代码以及注释,有兴趣的小伙伴可以试着自己搭建源码构建环境,然后 Debug 走一走,这样也可以互相探讨,共同学习。

笔者也是刚开始阅读学习源码,不足之处,希望多多指正。

相关推荐

最新文章

  1. Android-armebi-v7a、arm64-v8a、armebi的坑
  2. 【py分析】
  3. hdu 1243 反恐训练营 最长公共字序列
  4. 在html页,使用ctrl,shift多选表格行
  5. [Leetcode][Python]36: Valid Sudoku
  6. android ScrollView嵌套EditText
  7. HTML 颜色
  8. JavaScript 基本类型值-Undefined、Null、Boolean
  9. UVa437,The Tower of Babylon
  10. iOS之内存管理(ARC)
  11. 基于开发者中心DevOps流水线快速上云
  12. centos6.8下安装matlab2009(图片转帖)
  13. Android WiFi 获取国家码
  14. [CTSC2018]混合果汁
  15. HTML5 桌面提示
  16. Log4Net基本配置
  17. imx6ul开发板
  18. 【LeetCode 36_哈希表】Valid Sudoku
  19. MDL数据结构
  20. python中随机数生成

热门文章

  1. eyou升级弹窗、云插件库、接口配置、功能开关【按需显示插件】
  2. linux 安装部署
  3. 什么是 RedLock
  4. K8S Canal基于Prometheus进行实时指标监控
  5. 【kotlin】adapterPosition方法返回-1 无法获取位置
  6. Python - Git仓库忽略提交规则 &amp; .gitignore配置
  7. 数字取证autopsy系列——保存证据镜像(一)
  8. 四、API Gateway相关------微服务构架设计模式
  9. read/write系统调用
  10. 六:Redis配制文件