专栏首页JavaEdgeIoC容器初始化过程(下)1 BeanDefinition的载入和解析 2 BeanDefinition在IoC容器中的注册

IoC容器初始化过程(下)1 BeanDefinition的载入和解析 2 BeanDefinition在IoC容器中的注册

1 BeanDefinition的载入和解析

在完成对 BeanDefinition  Resource 定位之后,我们来了解整个 BeanDefinition 信息的载入过程.对IoC容器来说,载入过程相当于把定义的 BeanDefinition 在IoC容器中转化为一个Spring内部表示的数据结构的过程.IoC容器对Bean的管理和依赖注入功能的实现,是通过对其持有的BeanDefinition 进行各种骚操作来完成的.这些 BeanDefinition 数据在IoC容器中通过一个 HashMap 来保持和维护.

DefaultListableBeanFactory 的设计入手看看IoC容器如何完成 BeanDefinition 载入

图1.1 启动BeanDefinition的载入

对于容器的启动, refresh 是一个很重要的方法.该方法在 AbstractApplicationContext (它是 FileSystemXmlApplicationContext 的基类)中,详细地描述了整个 ApplicationContext 的初始化过程,比如 BeanFactory 的更新, MessageSource PostProcessor 的注册...看起来像是对ApplicationContext 进行初始化的模板,这个执行过程为Bean的生命周期管理提供了条件. 

图1.2 对IoC容器执行refresh的过程

2 BeanDefinition在IoC容器中的注册

BeanDefinition 在IoC容器中完成了载入和解析后,用户定义的 BeanDefinition 信息已经在IoC容器内建立起了自己的数据结构以及相应的数据表示,但此时这些数据还不能供IoC容器直接使用,需要在IoC容器中对这些 BeanDefinition 数据进行注册.这个注册为IoC容器提供了更友好的使用方式,在 DefaultListableBeanFactory 中,是通过一个 ConcurrentHashMap 来持有载入的 BeanDefinition 的.

图2.1  DefaultListableBeanFactory中用于持有BeanDefinition的ConcurrentHashMap

将解析得到的 BeanDefinition 向IoC容器中的 beanDefinitionMap 注册的过程是在载入 BeanDefinition 完成后进行的,注册的调用过程如图

图2.2 注册的调用过程

BeanDefinition 注册的实现

图2.3 用于BeanDefinition注册的registerBeanDefinition方法(上)

图2.4 用于BeanDefinition注册的registerBeanDefinition方法(下)

图2.5 registerBeanDefinition方法的调用关系

完成 BeanDefinition 的注册,就完成了IoC容器的初始化过程.此时,在使用的IoC容器 DefaultListableBeanFactory 中已经建立了整个 Bean 的配置信息,而且这些 BeanDefinition 已经可以被容器使用了,它们都在 beanDefinitionMap 里面被检索和使用.容器的作用就是对这些信息进行处理和维护.

这些信息是容器建立依赖反转的基础,有了这些基础数据,我们下面学习一下在IoC容器中,依赖注入是怎样完成的.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • IoC容器系列的设计与实现(基于Spring5.0.4)1 Spring的IoC容器系列2 Spring IoC容器的设计3 BeanFactory的应用场景4 BeanFactory容器的设计原理5

    JavaEdge
  • IoC容器在Web容器中的创建及初始化

    JavaEdge
  • IoC容器系列的设计与实现:BeanFactory和ApplicationContext2 Spring IoC容器的设计

    JavaEdge
  • Spring官网阅读系列(五):BeanDefinition(下)

    在上篇文章中,我们学习了BeanDefinition的一些属性,其中有以下几个属性:

    秃顶的Java程序员
  • 最详细的CentOS 6与7对比(一):常见设置对比

    CentOS 6: grub界面键入e,在kernel行最后加1,键入b启动进入单用户模式,之后输入passwd修改密码

    小慢哥Linux运维
  • 闲聊Python学习

    不知不觉坚持更新了22期Python读书笔记,先聊聊为什么要坚持对Python的学习~ 作为一个勤勤恳恳做Excel知识分享的人,为什么突然分享起了Python...

    用户1332619
  • OpenStack菜鸟笔记:溯源篇

    OpenStack是一个定位于IaaS(Infrastructure as a Service),旨在为公共及私有云的建设与管理提供软件的开源项目。自2010年...

    SDNLAB
  • 计算机网络原理梳理丨链路层

    香农信道编码定理:理论上可以通过编码使得数据传输过程不发生错误,或者将错误概率控制在很小的数值之下

    码脑
  • 分布式场景下使用APScheduler

    APScheduler是一个定时任务框架,其主要功能就是方便控制不同类型的定时任务,本身并没有考虑分布式多实例情况下的一些问题,本篇文章就来简单谈谈APSche...

    Python猫
  • Look,容器中应用的构建方法!

    S2I增量构建重用以前构建的image中的工件 要创建增量构建,请修改BuildConfig策略定义:

    魏新宇

扫码关注云+社区

领取腾讯云代金券