关于后端:Spring-源码学习-04初始化容器与-DefaultListableBeanFactory

35次阅读

共计 1887 个字符,预计需要花费 5 分钟才能阅读完成。

前言

在前一篇文章:创立 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 走一走,这样也能够相互探讨,独特学习。

笔者也是刚开始浏览学习源码,不足之处,心愿多多斧正。

相干举荐

  • Spring 源码学习 03:创立 IoC 容器的几种形式
  • Spring 源码学习 02:对于 Spring IoC 和 Bean 的概念
  • Spring 源码学习 01:源码浏览环境的搭建

正文完
 0