当前位置: 首页 > 科技观察

初始化容器和DefaultListableBeanFactory

时间:2023-03-22 16:28:54 科技观察

前言在之前的文章:创建IoC容器的几种方式中,介绍了四种方式。这里我们以AnnotationConfigApplicationContext为例跟进代码,看看IoC的启动流程。1、从JavaConfig加载配置的AnnotationConfigApplicationContext的启动方法如下:进入后发现构造其实就是当前调用的无参构造。所以也可以在启动时直接声明无参结构体,改写如下:System.out.println(context.getBean(UserComponent.class));}}今天我们就来研究这部分无参构造的逻辑!无参构造的StartupStep是5.3新增的类,看代码注释的意思Yes:表示用来记录启动过程中的一些指标信息。暂时不要做研究。主要研究红框部分!注意这块不只代表红框部分!因为AnnotationConfigApplicationContext继承了GenericApplicationContext,所以会先执行父类的构造方法。所以这里会创建一个DefaultListableBeanFactory的容器。DefaultListableBeanFactoryDe??faultListableBeanFactoryUML虽然Spring的BeanFactory定义了容器的基本概念,接口方法等,但是DefaultListableBeanFactory是一个具体的容器,确实可以说是新的,当然也可以暂且称之为bean工厂。我们来看看DefaultListableBeanFactory里面有什么?DefaultListableBeanFactory中初始化了很多参数,重点是以下两个参数:/**Mapofbeandefinitionobjects,keyedbybeanname.*///BeanDefinition的存储Mapwherekey为beanNameprivatefinalMapbeanDefinitionMap=newConcurrentHashMap<>(256);/**ListofbeanandefinitionNames,inregistrationorder.*///BeanName集合privatevolatileListbeanDefinitionNames=newArrayList<>(256);其中BeanDefinition描述了一个bean实例,它具有属性值、构造函数参数值以及实现提供的更多信息。对应的beanDefinitionMap就是存储的初始化的beanName和BeanDefinition。至于BeanDefinition的具体内容,我们会在下一节介绍。2.小??结通过上面的阅读,可以在初始化过程中增加一些模块,即实例化DefaultListableBeanFactory,然后再回顾一下DefaultListableBeanFactory的概念。ConfigurableListableBeanFactory和BeanDefinitionRegistry接口的默认实现:基于bean定义元数据的成熟bean工厂,可通过后处理器扩展。要掌握的关键是BeanDefinition的Map是在DefaultListableBeanFactory内部定义的。结束语本文从入口入手,进入构建。主要介绍了DefaultListableBeanFactory的创建,以及在创建的时候初始化了一堆参数。考虑到文章的篇幅,尽量避免发布大段代码和评论。有兴趣的朋友可以尝试自己搭建源码构建环境,然后调试一段时间,也可以一起讨论学习。本文转载自微信公众号“程序员小航”,可通过以下二维码关注。转载本文请联系程序员小航公众号。