Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory

前言

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

入口

从 JavaConfig 中加载配置的 AnnotationConfigApplicationContext 启动方式以下:函数

进去以后发现构造实际上是调用的当前无参构造。学习

因此在启动时也能够直接声明无参构造,改写为下面这种:spa

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));

    }
}

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

无参构造

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

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

由于 AnnotationConfigApplicationContext 继承了 GenericApplicationContext,因此会先执行父类的构造方法。继承

因此这里会建立一个 DefaultListableBeanFactory 的容器。接口

DefaultListableBeanFactory

DefaultListableBeanFactory UML

虽说 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 走一走,这样也能够互相探讨,共同窗习。

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

相关推荐

相关文章
相关标签/搜索