zoukankan      html  css  js  c++  java
  • Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory

    前言

    在前一篇文章:创建 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

    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 走一走,这样也可以互相探讨,共同学习。

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

    相关推荐

    作者: 刘志航

    公众号:『 程序员小航 』

    版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Notes

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/liuzhihang/p/source-spring-04.html
Copyright © 2011-2022 走看看