博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IoC容器初始化过程(下)
阅读量:6272 次
发布时间:2019-06-22

本文共 1466 字,大约阅读时间需要 4 分钟。

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容器中,依赖注入是怎样完成的.

转载地址:http://ojvpa.baihongyu.com/

你可能感兴趣的文章
Aptana插件在eclipse中安装
查看>>
jQuery-数据管理-删除事件
查看>>
下载器简单实例
查看>>
java实现分页工具类(JDBC)
查看>>
欧几里德算法与扩展欧几里德算法
查看>>
Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2)
查看>>
通过kafka提供的命令来查看offset消费情况
查看>>
oracle数据库从入门到精通之四
查看>>
自定义圆形图片控件
查看>>
sharepoint 2013 补丁升级步骤
查看>>
asp.net core 2.0 web api基于JWT自定义策略授权
查看>>
Skype for Business Server 2015-04-前端服务器-3-安装-管理工具
查看>>
第12章代码《跟老男孩学习Linux运维:Shell编程实战》
查看>>
我们为什么从Python转到go?
查看>>
5.Azure负载均衡(上)
查看>>
轻松精通awk数组企业问题案例
查看>>
26.Azure备份服务器(下)
查看>>
从“网上说的能信么”说开去---学习的思考
查看>>
DHCP 日志分析
查看>>
.NET Micro Framework动态调用C/C++底层代码(原理篇)
查看>>