初始化容器与 DefaultListableBeanFactory

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

 [[355480]]

前言

 

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

1入口

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

 

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

 

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

  1. public class AnnotationConfigApplicationTest { 
  2.  
  3.  public static void main(String[] args) { 
  4.  
  5.   AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); 
  6.  
  7.   context.register(JavaConfig.class); 
  8.   context.refresh(); 
  9.  
  10.   System.out.println(context.getBean(UserComponent.class)); 
  11.  
  12.  } 

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

无参构造

 

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

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

 

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

 

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

DefaultListableBeanFactory

 


DefaultListableBeanFactory UML

 

 

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

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

 

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

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

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

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

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

2.总结

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

 

再回顾一下 DefaultListableBeanFactory 的概念。

ConfigurableListableBeanFactory 和 BeanDefinitionRegistry 接口的默认实现:基于bean定义元数据的成熟bean工厂,可通过后处理器进行扩展。重点需要把握的是 DefaultListableBeanFactory 内部定义了 BeanDefinition 的 Map。

结束语

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

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

本文转载自微信公众号「程序员小航」,可以通过以下二维码关注。转载本文请联系程序员小航公众号。

 

责任编辑:武晓燕 来源: 程序员小航
相关推荐

2024-01-15 06:34:09

Gin镜像容器

2023-05-03 23:48:24

Spring容器初始化

2020-07-14 07:27:48

容器IoCSpring

2012-05-23 12:46:53

JavaJava类

2023-11-12 23:08:17

C++初始化

2015-10-30 09:51:19

Java重写初始化隐患

2023-07-13 09:13:18

Docker容器

2011-06-17 15:29:44

C#对象初始化器集合初始化器

2021-03-12 10:30:11

SpringMVC流程初始化

2010-07-28 10:22:33

FlexApplica

2022-07-06 10:37:45

SpringServlet初始化

2009-11-11 15:29:15

ADO初始化

2019-11-04 13:50:36

Java数组编程语言

2009-09-08 09:48:34

LINQ初始化数组

2012-03-13 13:38:42

Java

2009-06-10 16:17:00

Netbeans JT初始化

2009-07-31 17:51:27

C#对象初始化

2021-07-07 05:00:17

初始化源码

2009-06-11 13:26:16

Java数组声明创建

2024-03-08 08:26:25

类的加载Class文件Java
点赞
收藏

51CTO技术栈公众号