IoC容器初始化过程(下)

简介: 1 BeanDefinition的载入和解析在完成对 BeanDefinition 的 Resource 定位之后,我们来了解整个 BeanDefinition 信息的载入过程.

1 BeanDefinition的载入和解析

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

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

img_79e3d6c0cf3a4d4c1ed35e5a2ee9b3c5.png
图1.1 启动BeanDefinition的载入

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

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

2 BeanDefinition在IoC容器中的注册

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

img_113a9e90ab9119e588794555ff88e540.png
图2.1  DefaultListableBeanFactory中用于持有BeanDefinition的ConcurrentHashMap

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


img_7e92a021f6adff3fa18bc2d1a7fb30c8.png
图2.2 注册的调用过程

BeanDefinition 注册的实现


img_83f83552c31690e29760f7bc5916db6d.png
图2.3 用于BeanDefinition注册的registerBeanDefinition方法(上)
img_03fec9c10fc69d4de0ab3ccc802bf1a2.png
图2.4 用于BeanDefinition注册的registerBeanDefinition方法(下)


img_0df95e6926c109d2a1a54d24ee9fd19e.png
图2.5 registerBeanDefinition方法的调用关系

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

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

目录
相关文章
|
4月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
9月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
304 1
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
887 3
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
299 0
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
532 0
|
消息中间件 Kubernetes 数据库
在k8S中,初始化容器(init container)概念原理是什么?
在k8S中,初始化容器(init container)概念原理是什么?
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1026 108