更新时间:2024-05-03 10:09:13作者:佚名
前言
我最近写的系列文章得到了很多读者的好评,也有读者希望我多写这方面的文章。 甚至有读者私信我,问我如何阅读源码。 为此,我打算写一系列的源码解读来回馈一直支持我的粉丝们。
不知道你是否有以下经历:
源代码非常复杂。 说实话,这种文章很难写。 很难解释清楚。 写完之后会很长。 读者可能没有耐心读下去,读完后很容易忘记。
我打算采用图文结合的方式,去其糟粕,只解读一些精华部分,让读者在阅读源码时有一个清晰的思路,不至于迷失方向。 最重要的是,看完之后你能记住很多关键流程。
在庞大的系统中,IOC(控制反转)贯穿始终,其作用不言而喻。 我们先从IOC开始,介绍一下它的主要流程,给有需要的朋友一些指导。
入口
容器的顶层接口是:,但是我们使用更多的是它的子接口:。
通常,如果我们想手动初始化一个通过xml文件配置的容器,代码如下:
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User)applicationContext.getBean("name");
如果想手动初始化通过配置类配置的容器,代码如下:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
User user = (User)applicationContext.getBean("name");
这两个类应该是最常见的入口,但却殊途同归。 最终他们会调用一个方法,这才是容器初始化的真正入口。
顺便说一句,这些并不是唯一调用方法的两个类。 我们用一张图来整体理解一下:
虽然调用方法的类有很多,但我还是决定以类为例来给大家讲解一下,因为它足够经典,而且相对来说难度不那么大。
我再说一遍,由于源代码量巨大,即使我能一口气读完,恐怕你也没有耐心读下去。 所以我会采用Hello, Me的方式,忽略一些细节,只关注关键点。 如果有对某些细节感兴趣的同学,请加我微信与我交流,或者关注我后续的文章,会详细讲解。
方法
该方法是ioc的真正入口,负责初始化容器。
既然这个方法的作用是初始化容器,为什么这个方法不叫init呢?
答案很简单,因为它不仅仅被调用一次。
类中的run方法会调用该方法,该方法会调用一次该方法。
类中的方法会调用类中的run方法。 该方法也将被调用一次。
这就是为什么项目中引入该方法会被调用两次的原因。
类中的ntext方法会调用该方法,该方法会调用一次该方法,但是会提前判断容器是否被激活。
所以这里的意思是重建。
好了,不废话了。 以下是需要重点关注的关键步骤:
其实上图中乍一看似乎方法很多,但真正核心的方法却并不多。 我主要讲一下最重要的几个:
解析xml配置文件
ry方法会解析xml bean配置,生成对象,并注册到容器中(说白了就是在很多map集合中)。
经过几层调用(不详述,很简单),就会调用该类的方法:
该方法将循环(.xml 文件路径)ioc是什么意思,调用另一个方法,并逐个解析每个文件。
经过一系列运算后,会转化为和,然后转化为对象进行分析。
解析xml文件时,需要判断它是默认标签还是自定义标签。 处理逻辑不同:
只有 4 个默认标签:
对应的处理方法为:
注意:,,等都是自定义标签。
从上图中处理标签的n方法开始,经过一系列的调用,最终会转入类的n方法。
该方法包含关键步骤:解析元素生成和注册。
自定义属性的内容很有趣,这里不再赘述。 现在用得不多了。 有兴趣的同学可以加我微信,私聊我。
产生
让我们重点关注它是如何生成的。
上面的方法会调用类方法:
一个标签将对应一个对象。
该方法会调用同名的重载方法:n,真正创建对象,并解析一系列参数来填充对象:
其实实际的创建逻辑很简单,直接new一个对象:
真正的复杂性在于前面属性的解析和赋值。
登记
通过解析上面的xml文件生成了很多对象。 接下来,您需要将对象注册到容器中,以便容器可以初始化bean。
Utils类中的on方法非常简单,只有两个过程:
我们先看一下类的on方法是如何注册的:
接下来我们看看类方法是如何注册alias别名的:
这样就可以通过多个不同的别名找到同一个名字,然后再通过名字找到。
修订
上面的对象已经注册到容器中了。 接下来,如果我想修改注册的对象该怎么办呢?
通过方法中的方法修改对象。
经过一系列的调用,最终会到达类方法:
流程看上去很长,但实际上逻辑比较简单,主要是处理和ssor。
它本身就是一个特殊的ssor。 它还会执行 ssor 的逻辑,但它只是添加了一个额外的方法。
也许最重要的是,它处理@注释。
登记
处理完前面的逻辑后,该方法就会调用注册。 它的功能非常强大,将在后面的文章中详细讲解。
经过一系列的调用,最终会到达类方法:
注意ioc是什么意思英语作文,这一步只是注册,实际使用稍后再说。
总结
之前主要介绍过:
容器初始化的入口点
该方法的主要流程
解析xml配置文件
产生
登记
修订
登记
以上内容只是容器初始化的前期准备工作。 先给大家预览一下,真正的表演在后面:实例化bean、依赖注入、初始化bean、调用等等。
亲爱的朋友们,展开公众号右上角“设为星标”即可立即看到我的好文章。 它纯粹是提供信息的。 错过实在可惜。