好,接下来我们来看一下这一道比较重磅一点的面试题,它的难度系数呢,我也是直接拉满了,反正很多的一线互联网公司啊,都有问过他,据我知道的,你像这个蚂蚁金服二面美团好未来啊等等都问过这道面试题, 更别说一些个三四线互联网公司小公司了。基本上凡是问到 siri, 凡是问到底层,百分之八十都会跟这个 ioc 的原码底层原理相关的,所以说这道面试题是非常非常重要的, 那么当然我们今天没有办法说详细的去给他们,给他们呢去讲解整个 ioc 的一个加载过程。我之前呢有讲过一节两三个小时的 的一节公开课,咱们有详细的想去了解呢,可以找一下我的助理老师,或者说呢联系二位主去拿到这样的一节专门讲 supremi 加载过程的一节公开课。好吧, 那么我们在这里呢,我会大概的给他们用图说的方式呢,因为我之前讲这个什么 ioc 加载流程的时候呢,有一张这样的图,我们就拿这张图呢来讲一下他的整个下载过程,当然 我之前说过他的难度系数是非常高的,你如果之前没有看过四轮远马呢,你肯定只能说 后续,我最后呢会提供一个这样的答案,你们呢,可以死记硬背,只能这样说,因为你没有看过原码吗? 对不对?哎,如果说看过原码的呢,我相信就是说我给你捋一遍之后呢,你应该大概就知道怎么回答了。好吧,好的,那么我们就来说一下,首先搞清楚一点, siri 加载他是从什么时候开始的? 他是在我们去扭一个什么,扭一个艾布里 k 式的孔太子的时候开始的, 大家知道什么是 l k 胜孔太子的吧?我们称之为什么?称之为 surpry 的上下文,或者叫做 surpry 容器,对不对? 那么当我当然我们在应用程序当中不会去直接扭他,因为他是一个接口,我们通常扭的是他的一个实线类,你像拉丝 x 没有爱不离开是孔太子。我相信很多同学应该都在学,刚学 supreme 的时候都创建过一个这样的 surpry 上下文,对吧?然后传一个 surme 的一个 xm 配置文件进去,或者说我们如果说用纯注解零 xmao 配置的方式抓了孔夫的方式,我们通常呢会扭一个 lt 式的孔夫,一个 f 的开始, 对吧?然后呢传一个配置类进去,这也是一个这个 surme 上下文的一个实现类。 当然不管是哪种失信类啊,我们在这里就说,当我们去创建一个 siri 容器,或者说创建一个 siri 上下文的时候呢,就会进行 ioc 的一个加载,那么就会开始, 那他是做了哪些事呢?首先说白了, ioc 的一个加载过程就是我们并的一个创建过程, 那么病的创建过程呢,我们可以分成四大步,好吧,你就这么记,先记几个关键点先记几个关键点,好吧,因为 suprem 原码当中的东西太多了, 你不可能说听完之后呢,马上就能记住,知道吧?所以说呢,如果你没有看过远马,我还是那句话,我在这里呢,告诉你怎么去记那些关键点,然后呢,你去死记硬背,当然看远马,看远马肯定是最好的,对不对? 好,那么我们刚刚说了,是不是 ioc 的加载呢?其实就是病的一个创建过程,那么这个病的创建过程, 那他有四种形态,第一种形态,其实呢第一种形态他是还没有开始创建的一种形态,我们称之为概念态, 也就是呢,我们为这个病呢进行了配置,但是呢,他还没有去扭一个 siri 上下文,也就是这个 ioc 容器呢,他还没有开始加载,我们刚刚已经说了吗,就是当我们去扭一个 ipad k 审孔,再次扭一个 supreme 的容器的时候, ioc 才开始真正的加载,对不对?那么有半年胎的时候呢,还没有真正的开始加载,我们只不过呢为每为某一个类呢去给他进行 配置了,比如说通过 sml 的方式配置了,或者说我们通过注解的方式去给他配置什么 b, 这个时候我们称之为 概念胎,那么当我们去扭一个 surme 的上下文的时候呢, ioc 容器就开始真正的加载,那么首先呢,这个概念胎的病呢,会注册成一个定义胎, 就是我们所谓的一个病的分离神,这病的分离神呢,他其实就是把我们配置的这些病的定义信息啊,配置的病的定义信息。什么病的定义信息呢?就是当我们配置一个病 plus 等于什么什么?比如说看点图铃, 也就是配置了一个这样的病,然后呢,我们通常在配置这个病的时候,会声明很多的属性对不对,比如说累死他,是不是懒家仔的,奥特曼的,他的自动装配的方式等等等等 等等,有非常多的属性,对不对?那么这些病的定义的信息呢?我们会把它读取到一个病的分离审当中,也就说一个这样的病配置就会读取成一个病的分离审的对象, 能不能明白?这个应该相当好理解吧?就说我后续我要创建一个病,那么这些病的定义信息,我肯定要用一个对象给他端起来,后续呢才能更方便的来进行调用获取, ok, 他会把这些定义信息给他读取成并被分离,是我们称之为定义态,这是第二种形态,也就是 supreme, 我们的 ioc 开始加载的第一个形态,然后呢把这些信息加载完之后呢,我们是不是就要 去创建这个,也就是创建这个对象了?那么怎么创建这个对象呢?我们之前讲过一道面试题,就是 ioc 他的一个机制实现机制是什么?之前有一道这样的面试题,我说过是通过 什么?通过反射,对不对?那么我们要去创建这个对象的话,我们是不是就直接拿到他的这个完整内路径,然后通过反射就可以直接 去获得这个对象啊?对不对?比如说我们拿到这个类,拿到这个完整的类点 u sts, 是不是就得到了这个病他的一个 对下。当然这个时候呢,我们称之为一个纯静态,或者说叫做早期暴露 的一个病,好吧,这个我们称之为纯静态。为什么叫做纯静态呢?因为它里面的这些自动注入,依赖注入的这些属性是还没有,还没有负值的, 明不明白?所以说称之为纯静态,那么后续等到依赖注入解析完之后,也就是注入完属性之后呢?我们最终才称之为成熟态, 那么这是 lc 加载过程并的四种形态,好吧,先记住这四个关键点, 那么我们再来详细的说一下他的整个创建过程, ioc 的整个加载过程又是怎么样的?首先我们刚才说了,首先他是概念态对不对?那么概念态呢?他会调用一个叫做 因沃克并 fakt 瑞 houst pro stes, 我们称之为调用一个并工厂的后置处理器,这是 supreme 对外提供的一个扩展接口, 那么 siri 他通过这个扩展接口呢?当然他既对外扩展,对外呢?既扩展对内呢?结偶, 所以说他内部也在,自己也在使用啊,那么他通过这个方法呢,就会去将我们概念态的这些病呢给他注册为定义态,能明白。 就比如说我们有一个卡的这样的一个病,有一个 suv 的这样的一个概念,他的病这两个,那么就会注册为两个病。对分离审能不能明白?那么他们的克拉斯的 这个定义信息呢?会给他读取到这个定 plus 的属性当中, 能明白,因为这是都属于病低分离省的属性啊,这些 ok, 那么到这一步呢, 我们第二个形态算是加载完了,大家记住是通过调用一个音沃克就是你如果记不住这个英文,你就记住调用一个并工厂的后置处理器,好吧,记住这个, 然后呢注册成我们的一个定一分离审,也就是定义台。当然在这个过程他是怎么注册的呢? 我稍微稍微提一下,好吧,因为这个方法当中他非常的复杂,你看我这里提供了一个链接,提供了一个链接, 那么这个方法呢,也是要也就是我们的这个概念态的这个病注册成定义态的这个病啊,他也是有非常复杂的一个过程的,也是需要呢单独的去讲一节课,你看里面的过程非常非常的复杂,同时呢 我们可以大概的想到他首先会去解析配置类里面的这些注解,知道吧?会去解析这些注解,那么我们就拿这个孔泼呢的 sky 来说, 他会去扫描我们指定的一个包,也就是说呢,比如说我指定的这个包是靠点竹林的话,他会拿到这个包里面所有的点克拉斯文件,然后呢看一下你这个类上面有没有一个孔扑呢?他 注解,然后如果有这个注解的话,他就会把你这个当前这个病呢给他注册为并一分离审,是大概这样的一个过程, 然后注册完病一胎之后呢,就要开始真正的生产了,那么生产呢,他会教给一个叫做病工厂病 factry, 好吧,并三腿呢,他主要负责生产,他会调用一个 get, 并,也就是我们之前所说的这个 工厂的设计模式,好吧,就是由这个病 fx 体现的,他会调用一个 bs 病方法来进行生产我们的病, ok, 好,我们看一下。 当然他在生产之前呢,首先会判断一下你当前这个病是不是符合生产标准,怎么样才符合生产标准呢?也就是你需要是当立的, 并且呢不是懒加载,并且不是抽象的,他才会在 ioc 加载的时候呢为你进行生产, ok, 那么我们就假设我们当前这个病呢,他符合生产标准,那么他首先呢会去判断你是不是已经创建完了,因为我们大家应该都用过该的病这个方法,对不对? 当我们创建完了之后呢,我们就是获取了,所以说这个该的病方法,他既负责创建,也 负责获取,所以说在调用这个该的病方法在里面啊,他就会去拿到我们所有存这个 成熟态的一个卖法,知道吧?因为我们所有的单例呢,其实都是存在一个卖法里面,那么他就会拿到这个卖法,根据你的这个病的名字呢,作为 t 去这个去这个卖法当中去找, 如果找到了直接返回,如果没有找到呢,就会给你进行创建,所以说我们刚开始加载的时候,里面肯定是没有的,对不对?那没有的话呢,他就会帮帮我们呢开始进行创建。 创建呢,首先会进行实力化,实力化呢,其实我们刚已经说了,其实就是通过 反射的方式,好吧,当然除了反射的方式呢,还有还有其他的几种,我在这里呢就不详细的去讲了,好吧,我刚已经说了,如果同学们想深入的了解你肯定要去看原码, 你肯定呢不是说我们今天去讲解这道面试题,你能够把它深入的能够了解的,好吧,如果想深入的了解,去找我的助理老师或者找二博主呢,去拿一下我之前讲的一节完整的 ioc 的加载过程公开课, ok, 然后呢实力化, 实力化这一步呢?其实你可以说通过反射,那么实力化完之后呢,我们称之为什么纯静态,对不对?那么这时候就就到这一步了啊,并且这个过程他都是在并工厂的这个过程当中进行 生长的,好吧, 实力过完就是我们刚刚说的纯静态了,然后呢他会属性负值,属性负值呢,其实就是我们之前所说的 ei 的一个体现, ei 的一个实现, 他会根据你的一个自动注入的一个类型,比如说掰太派呀,掰内蒙呀,掰 cosplat 呀,还是你使用的奥特曼的给你进行自定义, 进行自动注入的这种注解的解析,总之呢他会把你的这种依赖注入的属性呢,在这一步给你进行注入进去, 好吧?然后最终呢进行初始化,那么在初始化这一步呢,他会去调用,他会。
粉丝4.7万获赞5.1万

嗨,大家好,我是从事家外软件开发十六年的资深系统家务师老赵。今天跟大家聊聊 supreme 的 ioc 容器深度解析。这条视频你一定要认真看完,让你对 supreme 的 ioc 容器的设计理念有一个耳目一新的深刻理解。请您 舞弊、点赞、收藏,反复认真观看学习。咱们直接进入正题。那什么是 ioc 容器呢?其实简单来说, ioc 容器是负责管理避孕对象的生命周期和依赖关系, 大大简化了应用程序的开发和维护。它是 supreme 框架的核心特性之一。英文名称为 inversion of control, 翻译成中文就是控制 反转。那什么是控制反转呢?哎,其实讲个故事大家就会很清楚了。比如小明同学,大学本科毕业,工作刚一年,到了谈婚论嫁的年纪。通常情况下,都是靠自己的个人魅力来寻找合适的恋爱对象, 也叫自由恋爱,主权在自己手里。而在古代的封建社会,小明同学的婚姻恋爱基本上是 父母包办寻找恋爱对象,资主权在父母手里,小明只负责恋爱结婚。同理加完毕。恩,对象的创建控制权 未使用四川 lc 容器之前,有程序员自主控制创建使用,之后控制权转移给了 lc 容器,包办所有避孕对象的创建,程序员只负责使用避孕对象。 ioc 容器就相当于小明的父母掌握了毕竟对象的创建控制权,故称为控制反转。在 super 用中, ioc 容器负责创建、配置和管理应用程序中的对象, 他基于依赖注入的原则,将对象之间的依赖关系委托给容器来进行处理。 那么容器根据配置文件或者注解了实力化对象,并自动解决对象之间的依赖关系,使得我们可以专注于业务逻辑,而不必关心对象的创业和依赖问题。 supreme lc 容器有多个核心组建构成,包括 being factory、 application context、 being definition 等。接下来我 我们将逐个分析这些组件的实现细节。那什么是并 factory 接口呢? b victory 是 supreme 的 ioc 容器的核心接口,定制了容器的基本功能。他提供了以下重要方法。 get b 根据 b 的名称来获取对应的实力 contact b 判断容器中是否包含指定名称的 b is single time 来判断指定名称的 b 是否是单例。 get type 获取指定名称的。病的类型。在 supreme 的底层, factory 病接口的主要实现类是 default being factory。 它继承了 abstract、 auto wire capable being factory, 并实现了 configurable listable being factory 和 being definition registry 接口。 那什么是 application context 接口呢?哎。 application context 是 b victory 的此接口它提供了更多的高级特性和功能。 除了避免 victory 的基本功能外, application context 还支持以下功能资源访问可以方便的访问各种 资源文件,比如配置文件、图片等。国际化支持提供了国际化处理和多余 支持。事件发布支持事件驱动的编程模型,可以方便的进行事件的发布和监听。 aop 支持集成了面相切面编程的功能。 那么 application context 的常用实践类有 class pass xml application context、 file system xml application context。 他们通过解析配置文件来创建容器并初始化对象。那什么是 being definition 接口呢? bean definition 是描述一个 bean 的原数据接口,它记忆了 bean 的属性和行为。它也包含了以下关 关键信息类型病的类型。那么作用欲是病的生命周期,如星空汤 prototype 属性病的属性列表依赖病所依赖的其他病。 在底层 bin defini 形接口的主要实现类是 generic bin defini 形,它继承了 abstract bin defini 形,并提供了通用的实现。那什么是 bin 的生命周期呢? 病的生命周期在面试中是最常问的知识点,这些知识点可以理解的去记忆。首先 让大家看一张流程图,从图中大家可以清晰的看到 super 用的 ioc 容器负责管理病的生命周期,包括创建、初始化和销毁。 在底层通过 being post processor 接口和 being factory post processor 接口来实现, 并 post processor 负责在病的舒适化前后进行一些处理操作, 比如 a、 o、 p 代理、属性注入等。 infectory post processor 则在容器加载配置文件时对配置信息进行修改或扩展。 l、 c 容器的 初始化过程可以分为以下几个步骤一、读取配置文件容器根据配置文件读取并的定义和其他相关的信息。 这些配置文件通常包含了 b 的名称类、路径、依赖关系的。二、 创建并得分女性对象根据读取到的配置信息,容器会创建对应的并得分女性对象,并得分女性对象,保存了每个并的原数据,包括类型、作用欲、属性等。三、 解析依赖关系容器会解析各个病人之间的依赖关系,通过查找病人带分逆行对象的属性或构造函数参数,容器可以确 性避孕之间的依赖关系。四、实力化避孕对象根据避孕的分离性信息,容器会实力化各个避孕对象,通常是通过加瓦的反射机制来创建避孕的实力。 五、属性注入容器会将配置文件中定义的属性值注入到 相应的闭引实力中。可以通过 set 方法自算注入或构造函数参数来注入 来完成。六、 over 接口回调如果并实现了 over 接口,容器会调用相应的回调方法将一些特殊的资源注入到并中。七、初始化回调如果并实现了允许拉 b 接口或定义了 initmase 的回调方法,容器会在 b 实力化完成后调用这些方法完成 b 的初始化工作。 把 bin post processor 处理在 bin 初始化过程中,容器会掉。以注册的 bin post processor 实现类的方法来对 bin 进行一些额外的处理操作。九、 容器就绪所有的病都经过了初始化和处理后,容器就就处于就绪状态。可以通过改善病方法获取病实力,并开始使用他们。使销毁毁掉。当容器关闭时,会调用病 实现了 disposable 闭眼接口或定义了 destroy mess 的回调方法的销毁方法,完成闭眼的清理工作。以上十条是 lc 容器初始化的主要步骤, 主要涉及到了配置文件的解析、依赖注入、实力化、初始化回调和销毁回调等过程。 这些步骤都是由 supreme 框架底层的代码和组件来完成。因此我们开发人员可以专注于业务逻辑的边形,而无需关注容器的具体实现细节。好了,以上是老赵给大家介绍的 supreme lc 容器的深度解析内容, 欢迎关注老赵聊加瓦,为您的加瓦编程职业生涯保驾护航,实现财富自由。有什么关于加瓦开发方面的问题,欢迎大家在评论区留言,共同探讨。记得关注再走哦!

好,那我们继续啊,到这呢,我们这个 spring 并的生命周期啊,就给大家讲完了,下面呢,我们对 spring ioc 啊,这个就是并的一个构建过程,整体给大家做一个总结啊,就是这张图 啊,这张图挺重要的,因为后期我们在学习过程当中,我们有很多死兵自己的功能啊,增强的都是通过这张图然后进行介入的 啊,所以说这样图你搞明白,后期我们再讲视频其他一些功能原理或包括他的原码时,我们回归到这张图当中,一看就能明白他到底是怎样,然后进行介入到我这个整个过程当中的。好,那这张图呢,因为有些小啊,我这样给大家讲 啊,稍等,然后打开这个图啊,英文在讲这个就是最后这个这张图叫 spring 并的,然后整体这个流程图的时候呢,我们是一步一步演变的,对吧?在这个演变过程当中呢, 我们每演变一点会加个知识点,每演变一点会加个知识点,那我们就顺便呢在这讲这张图的时候呢,从头到尾我们也算复习一遍, ok 吧。咱们先看第一张图, 这张图我们讲的什么呢?是讲的然后死病并的一个基本的一个呃,就实名化的过程 是吧,那就是我们现在用的插毛方式去配置的是吧?后期我们可能还会用注解方式,对吧?注解方式无非就是在这地方把它换成注解而已啊,那我现在然后这个插毛方式呢,首先我们这个地方有个有个什么,有个并标签, 这个并标签最终是不要进入到 spring, 哎,我们所谓的 spring 容器,其实它内部有一个脉搏啊,这个脉搏到最终呢,存储就是我一个对象啊,现在这个大家已经清楚了,是吧?那这个并标签是怎样变成最终一个并对象的呢?哎,它是通过一个 been definition reader 啊,就是个读取器,这个读取器呢? 会读取我们这个插面文件,是吧?把内部的,然后这个文件内内插面文件内部配的这个并标签啊,每一个并标签的信息都抽取到外边,就解析到外面啊,封装成个叫 indiffnition 的一个对象啊,这个我们把它叫做并定义对象, 对吧?啊?就换句话说,这个并定义对象封装的是并标签的一些信息。在这我强调一下啊,这个并定义对象并不是最终你配置那个并的那个对象本身, 你比如在这地方我拍的是不是 uzdo, 你最终从认到我这个容器是不是应该是个 uzdo 对象吧?而这个地方并 dha 是个 uzdo 对象吗? 不是,他内部存储是当前我这个并的一些信息,明白吧?所以他叫做并定义对象,而我这个内部有很多标签啊,是吧?每个标签都封装成一个 been differentiate 对象,那这些并 differentiate 的对象 就存哪呢?哎,存置到我们这个 individation map 当中啊,它是个卖吧,那存完之后呢?哎,死不容器会盖件事,就把你这个卖配啊,哎,全部都循环一遍,就编给一遍,取出每一个 indiffination, 然后从这个 indiffection 内部呢,再取出它存储的一些信息,比如说我这个病的权限的名,是吧?取出完之后干什么?通过反射去创建对象? 能明白把创建好的对象存哪啊?存储到也是一个卖法是吧?这个卖部叫 singletop objx, 我们把它叫做单力池,是不是单力池吧?哎,存到这个位置,而我们最终在 get b 时呢? 啊,就根据名字上或根据类型盖的背时呢,其实就是从我们这个当地持这个卖部当中获取对应并进行返回的。好,这是我们讲的第一张图,这没问题吧? ok, 那这张图讲 完之后呢?我们接着讲什么呀?哎,讲的然后并的一个特别重要的扩展点是吧?叫 be factory post processor 啊,翻译成中文叫什么?叫并工厂后处理器 是吧?那兵工厂后程的记他是在哪个地方然后执行的?哎,他是在我们这个 individ 就是个 indiffination map 啊,都封装完毕之后,就都填充完毕之后进行,然后创建对象之前执行的。所以说呢,我们就进入第二张图的学习 she is 吧。 ok, 那通过这个 reader 把每一个然后这个 individence 封装好,就最终存置到一个 map 当中啊,这个 map 然后存储完毕之后呢?哎,他在然后取出每一个 individence 创建对象之前,他要经过 in factory post 的 processor 的一个执行,也 也就叫病工厂处理器,对吧?他是我们死病特别重要的一个扩展点是吧?呃,因为这个病 factory post possessor 啊,我们当时给大家做个 demo 是吧?哎,他内部的方法呀,就内部要自动调的方法,然后我可以通过这个内部要提供的一些方法,然后进行并 definition 的修改, 对吧?也可进行 indiffnation 的注册啊,就说原有在这个插苗文档插苗文件当中配置的并是不是可以进入到这个 indiffnation 卖部当中, 对吧?那我还还可以在这通过代码是吧?人为的啊,通过代码可以动态的向我这个卖部当中去干什么?添加一些 beneficiation, 就是你只要把这个并肩并肩的最终添加到麦当中,那死不定是不是就会把它创建对象最终放到这个单给池当中吧。所以说这个地方,哎他有这么一个扩展的一个作用啊,而我们这个边 factory pose processor 呢?它其实内部那个方法注册啊,我们这个 individation 稍微麻烦一点儿,所以说呢,我们就又学习 in factory post processor, 它这个子接口叫 indiffnition registry post processor, 后期我们在学习后边的知识点的翻阅码时会经常看到它 它内部提供的方法可以特别方便的向这个 map 当中去注册我们的 indiffnation, ok 吧?好,那我们就学完这个呢,学完这个之后呢?我们又学什么? 哎,我们又学的,哎。又一个扩展点是吧?哎,就是我们这个,呃。当这个对象创建完毕之后 是吧?对应创作完毕之后,呃,就是这个 individation。 每个 individation 是不是对应一个并对象是吧?并对象创作完毕之后填充到我们这个 map 之前啊?填 到达之前中间还一个步骤吧,哎,就是我们的边塞,呃,那个边 pose processor 我们把称为什么呀?并后充电器是吧?他也是对我们这个呃功能的一个扩展啊,也是死病特别重要的一个扩展点,他主要干嘛呢?哎,我们看一下,哎,我看下边,下边这张图就这样图, 是吧? ok, 那这个 bin, 那这个 bin, 呃,就是这个 bin post possessor 呢?它是分为两个方法,一个是它前置方法必复,一个是它后置方法 after 这个 bin diffication, 然后创建对象之后存入到我们这个 map 之前,是不是要执行它比作方法,然后呢?再执行它的 after 方法,在这个地方能干嘛呢?哎,我能做什么扩展呢?哎,我可以对进入到这个 map 之前这个 object 是不是做相的一些功能增强?是不可以做一些,比如说,呃,属性一些数据的一些修改,能不能做?可以做吧?也可以,对,干什么呀?也可以对我们这个 object 就这个对象,然后进行增强,比如我使用动态代理, 对吧?啊?对它然后进行包装,最终存置到 map 当中,是一个 proxy, 那这样的话你在盖被时获取的什么呀?是这个并对应的那个增强对象, 能明白吧?哎,其实我们 aop 就是基于然后这个地方去做的。 ok, 那这个学完之后呢?哎,我们就把然后前面我们学习一些知识点,包括在这张图当中一些知识点进行整合。我们前面学过哪些知识点?就在学那个啊,并且些基本配置时,我们是不是学过那个像以内的方法呀? inition as 并呢?对不对?哎,把这一方法给我们这个并 pose processor, 还 be factory pose processor, 哎, 跟他整合到一起,其实就是我们最后一张图啊。最后一张图,最后一张图讲的是什么呢?其实这张图包括两部分吧,左边一部分跟是不是右边一部分 甚意思吧?左边这一部分其实说白了就是我那个 indiffnation map 的一个一个填充啊,我们把叫做什么呀?把它叫做,其实就是我们这个并史上开发过程当中的一部分叫并的定义过程 啊,并定义的过程是吧?定义完毕之后呢?我们是不是要创建对象是吧?然后最终存储到容器?创建对象跟存储到最终这个脉搏之中间,这个是不还有一个并的初始化阶段 是吧?这个阶段就第一个虚框框,这个阶段我们把它叫做并的实力化阶段。第二个虚框框我们把叫做并的初始化阶段。第三个虚框框我们把叫做并的存这个存储阶段。这三阶段 组着组到一起要把它称为什么?并的生命周期啊?更准确的讲, supreme 并的生命周期我们刚讲完对不对? ok, 那主要在并得到数数化阶段,这它要进行这么几个步骤。首先属性填充 啊,你就想我们的 service 是吧? service 要创建完毕之后,是不是内部要注入 d o 对不对?所以它是在并创建完毕之后啊,在这个地方要进行一个 d o 的注入的啊,属于填充。填充完毕之后呢,看当前这个 object 啊,这个并是否实现我们这个 over 接口呢?如果实现 over 接口,是不是要调用对应的 over 接口? 像 obligation 抗拉的 vr 比 factory ovar 一般我们就很少实现,是吧?哎,我们后期再呃,再去讲一些高级部分的时候,哎,我们去就是翻一些原码的时候,你会发现有很多啊,有很多它底层的一些病都去实现 ov 接口呢,就 spring 帮你去注入对应的,哎,你需要的一些底层的并啊, ok, 再往下走就执行我们的并 pose processor b for 方法,是吧?再往后走就是我们这 inito let's been 这个接口说法就初始化方法,它内部的初始方法是不是不叫 afterproper site 方法 啊?通过名字也知道他这个 after process 方法是在使用签中之后执行的,是吧?执行完这个 after processor 方法之后呢,就执行我们自己定义的初始化方法啊,通过那个 unit method 然后进行啊配置的,是吧?最后呢,执行并 post processor 的 after 方法, 朋友吧,都这样,完毕之后再把这个病然后存置到我这个容器当中,可以吧?这地方的病他是个半成品,就他,虽然这个对象创造完毕呢,就对象在内存当中是比有有空间的吧,并且有地址呢,但这个病可能他有些工作没有, 比如内部上需要这些属性,可能还没有注入,对吧?对应一些处理方法还没有完成,对吧?等到这个位置呢,这个位置并就是一个完整的啊,他其实那个那个就是在内存当中的那个还是那个并,只不过内部对应的是不是属性注入完毕呢?包括处理方法是直营完毕的吧? ok, 再贴入到我这个麦当中, ok 吧。哎,这是我们这个并的一个声母周期, ok, 这是整张图的一个期限, 可以吧?其实对于我们这个 spring 啊,一个从入门到精通的课程而言,是吧?哎,说白就是入门课程,你只要会扎外吧,学这个课程就能学,是吧?讲到这个程度,我告诉大家其实已经比较深入了 啊,现在可以你可以看一下市面上架构师的课程,无非也就讲到这个程度啊,估计还没有这张图讲的明白啊。 ok, 当然我这张图画的,其实我自己在画的时候用这个 plus on 啊,在画的时候我这标注一个简单版啊,为什么叫简单版呢?其实它在处理画这个过程,这个地方,包括前面啊,这个地方就从 individation 到 up 这个这个过程,其实它内部还有很多细节, 那咱打个比方啊,比如这个地方 impose processor 是吧?它只有 befall 跟 after 方法是吧?但是呢,呃,其实 spring 底层啊,又为这个 impose processor 又是又提供很多子子接口, 而这个子接口大大概有七八个方法,他会,然后充斥在我整个这个创建过程当中,每个小节点都会插入一个对应的回调方法啊。如果要讲那个,呃,我们可能光讲这个就是对应的 ben pose process 对应的体系,呃,就得讲三个小时是吧?所以在这呢,我们 还是说对于大家而言,讲到这就没有问题了,这课程已经很慎重了。而且你把这张图搞明白,你出去应付面试啊,就对于现在而言,你应付面试一点问题都没有 啊。现在企业当中的面试官问这个死病的啊,底层问死病那些原理无非到这张图当中啊,到这个图图的层次已经完全 ok 了 啊,我在强调这张图非常重要,因为还说我们这课程不是表面的应用,后边再讲其他的,比如讲注解,讲 u p, 都讲他的原理是吧?在讲原理的时候,我们回头还要去看这张图,所以你这张图搞明之后,到那个时候再讲原理的时候,哎,你就会 会经常会看到我在这张图当中讲到的一些东西,好吧?行,那 spring 并的一个啊声卡的过程,哎,我们就讲到这。

哈喽,大家好,我是麦克,一个工作了四年的粉丝啊,他在面试的时候遇到一个这样的问题,他说行李介绍一下 sproc 的工作流程,他说,啊,他回答不是很好,希望能够通过我来帮他梳理一下。那么对于这个问题的高手部分的回答我已经整理成了文档,如果你想需要 可以在主页加微去领取啊。关于这个问题呢,我们看看普通人和高手的回答。普通人的回答, 嗯, ioc 的工作流程就是就是我们直接可以就是。嗯,是不是你启动的时候,他会把那个我们声明的这些病吗? 然后注册到 ic 容器里面,然后我们直接用那个,呃,用那个注解啊,用那个叫叫叫叫 outy 的注解就可以用了,就是直接去从容器面去拿这个,拿这个,对枪实力,嗯, 对,嗯,高手的回答,嗯,好的。这个问题呢,我会从几个方面来回答。 ioc 的全称叫 inversion of control, 也就是啊,控制反转,他的核心思想是把对象的管理权限交给了容器 应用程序,如果需要使用某个对象的实力,那么直接从 ioc 容器里面去获取就可以了。那么这种设计的好处在于降低了程序里面对象与对象之间的偶和性,使得程序的整个体系结构变得更加灵活。 spring 里面啊,提供了很多方式去声明一个病,比如说在 x 妙配置文件里面通过病的标签,或者通过 service 注解,或者通过 come figure 选配置类里面通过病注解去声明等等。啊,那么 spring 在启动的时候呢,会去解析这些病,然后保存到 ioc 容器里面。 spring ioc 的工作流程呢,大致可以分为两个阶段,第一个阶段是 ioc 容器的初始化阶段,这个阶段主要是根据程序里面定义的 x 量或者注解等病的生命方式,通过解析和加载后生成病 definition, 然后把病 definition 注册到 ioc 容器里面, 通过注解或者 x 妙声明的病啊,都会解析得到一个病百分之一选实体,这个实体里面呢,会包含病的一些定义和基本的一些属性。最后啊,把这个病百分之一选保存到一个麦克集合里面,从而具有完成 ioc 的一个初始化。 ioc 容器的作用呢,就是对这些注册的病的定义信息进行处理和维护,它是 ioc 容器控制繁殖的一个核心。第二个阶段是完成病的初始化和依赖注入。进入第二个阶段以后呢,这个阶段会做两个事情,第一个是通过反射去针对没有设置勒的阴历的属性的单粒病 进行,说实话,第二个是完成病的依赖注入。最后一个阶段就是病的一个使用,通常我们会通过 auto y 的这样一个注解,或者通过并 factory 点 get 病,从 ioc 容器里面去获取一个指定的病的一个实力。另外啊,针对设置了 lazy 阴历的属性以及非单例病的一个实力化, 是在每一次获取病对象的时候,要用病的初始化方法来完成实力化的,并且什么用 lc 容器呢?不会去管理这些病?以上就是我对这个问题的理解, 对于工作原理或者工作流程性的一些问题啊,大家一定要注意回答的结构和节奏,否则面试官会觉得你很混乱,无法去理解,导致面试的效果呢,大打折扣。 高手部分的回答逻辑呢是非常清晰的,大家可以去参考。好的,本期的普通人 vs 高手的面试系列视频呢,就到这结束了,如果你喜欢我的作品,记得点赞和收藏再加关注啊!我是麦克,一个工作了十四年的家化程序员,咱们下期再见。

ioc, 那么这个 ioc 了这个东西呢也是我们在 supreme 中面试了一个最最核心的地方啊,那么面试 supreme 不可能不问 ioc 啊,那么因为这个东西呢,实际上就是我们的 supreme 容器,对不对? supreme 容器指的就是 ioc 容器,所以说要问 supreme 肯定会从这个 ioc 开始, 那么对这个 ioc 到底怎么样去理解呢?我们来看一下这个韩梅老师给大家归纳的一个答案啊。那么首先啊要来谈这个 ioc 的这个理解的话,首先呢我们从三个方面去回答这个问题啊,第一个呢叫做容器概念,第二个呢是控制反转,第三个叫做依赖注入啊,从这三个方面去回答, 那么对这个 ioc 的理解,首先就是这个 ioc 本身是个什么?这个 ioc 本身呢,他是一个容器,是个容器用来干什么的呢?他是用来存放我们 的各种对象,就是我们加瓦中的各种对象,你可以了,实际上呢就是一个迈步啊,可以理解成一个迈步,那么它里面存的这个对象呢,其实就是我们,比如说我们在擦没有配置,你啊擦没有文件里面配置的这个病,以及呢我们通过这个注解 啊,就是修饰的一些类,这个呃实力啊,这个病对象,那么呢都是用来了存放在这个 ioc 容器中的,那么在我们项目启动的时候呢,会读取这个配置,或者说呢 扫描这些注解啊,然后呢将这个呃实力呢把它创建出来,创建出来了,然后把它放到这个卖部里面,就是我们 lc 的这个卖部啊, 那么这个时候呢,这个卖部里面呢,就有了各种对象,对不对?我们,嗯自己想想,把它放到这个 ioc 容器中的这个对象,那么都到了这个卖部里面,那么接下来呢,这个代码里面呢,我们还需要用到里面的对象,对不对?还要用,对不对?你现在只是把这个对象存到这个卖 里面去了,那我们后面呢还要用,对不对?而且呢还要通过了,还要给这个对象去复职,对不对?这个对象的一些属性呢?还要去注入啊?那么这个时候是通过什么来注入的呢?通过 d i, 也就是我们后面讲的这个依赖注入啊,通过这个依赖注入,把这个属性的往这个对象里面呢去注啊,就是我们对象的属性呢,需要去负值吗?那么这个就是依赖注入啊,我们来再来啊,看一下这个,呃, 控制反转这一块啊,那么控制反转呢,实际上跟我们的依赖注入了也是有关系的啊,那么什么是控制反转呢? 在没有引入引入 ioc 容器之前啊,我们讲这个反转肯定是跟我们常规的这个相对而言的,对不对?那么没有引入 ioc 之前,比如说我们对象 a 啊,要依赖对象 b, 就是比如说我们在这个 a 的这个实力里边,我们去又了一个 b, 那么也意味着 a 了, 带了 b, 对不对?或者说在我 a 这个类里边呢,我有一个 b 对象的一个属性,那么就说明你依赖了这个 b b 对象啊,那么这个来说,我们没有引入 ioc 的话,我们可能就要在这个 a 的这个代码里边呢,去直接的去写这个六一个 b, 对不对?然后呢 这个对象啊,在 a 出石化啊,或者是运行到某一点的时候,对吧?就是我们自己必须主动的,要主动的去创建 b 对象啊, 或者是呢,使用已经创建好了的逼对象啊,这也是有可能的,但是呢,你都是主动的去获取,或者是主动的去创建啊,然后呢?呃,无论是创建的还是使用逼对象控制权呢?都在我们程序自己手上,对不对?说白了都是在 a 对象里面啊,都是,这都是在 a 对象这个控制权呢, 在 a 对象里面,当然你也可以认为是在程序员这里啊,呃,实际上就是说,比如说我们 a 依赖 b, 那么呢, 这个 b 什么时候创建,怎么创建?就由这个 a 在这个 a 代码里面呢决定了,对不对?那么这个就是我们普通的这个啊,普通的这个控制,对吧?就是在没有引入 ioc 之前, 那么引入了 ioc 之后呢,这个对象 a 跟对象 b 了,他就不会直接关联了,而是呢,通过这一个 ioc 容器,比如说这个是 ioc 啊,那么这个时候呢,这个 a 对象啊放到放在了这个 ioc 容器里面,然后这个 b 对象呢,也放到了这个 ioc 容器里面,他们通过都去依赖这个 ioc 容器啊, 而不是说这个 a 跟 b 了互相依赖,那么这个时候呢,对象 a 跟对象 b 呢,实际上是失去了联系的,那么这个时候如果说我 a 运行到了需要 b 对象的时候,对吧?就是说我程序啊初始化,或者是运行到了某一个点的时候,哎,我需要这个 b 对象,那么这个时候怎么办呢?是 ioc 呢,他会主动的创建 一个对象 b, 然后呢注入给这个 a, 注意啊,这个时候呢,是由我们 ioc 容器去创建这个 b 啊,或者是说呢,嗯,去获取这个 b 啊,如果这个 b 已经创建好了,那么这个 ioc 容器呢,他是会去获取这个 b, 或者是呢, 呃,重新创建一个,那么就看这个到底是个啊单立的还是一个多实力的,对不对?但是呢,这个,但是这个 b 这个对象呢,绝对不是这个 a 扭出来的,而是由 ioc 容器创建的,然后呢由这个 lc 容器主动的把这个 b 呢复制给这个 a 的属性, 这个就叫做控制反转。那么通过这前后两个对比,对不对?就是说 a 呀,获取依赖对象 b 的过程由主动呢变成了被动, 那这个控制权呢,就颠倒过来了,所以呢,为什么叫做控制反转啊?控制反转好,所以呢,这个全部的一个对象控制权呢,全部上缴给了第三方的一个 lc 红线, 对不对?就对象跟对象之间啊,就不存在直接关联了,而是呢都去依赖这个 ioc 容器啊,所以呢, ioc 容器就成了我们整个系统的一个关键核心啊,所有的对象呢啊,所有的这个我们需要啊,管理的对象都要往这个 ioc 容器里面去放,所以说呢,也说他是一个,嗯,粘合剂,对吧?万能胶啊, 就是把我们系统中所有的对象呢粘合在一起去发挥作用啊,那么,呃,这个依赖注入啊,就是我们讲完这个控制反转依赖注入了,实际上呢,他是用来了实现这个控制反转的啊,那么我们讲获得依赖对象的过程被反转了,对不对?也就说我 a 呀,依赖 b 本身呢, 是我 a 了直接去创建 b, 然后呢是通过这个,嗯,直接去依赖,对不对?然后有了 ioc 之后呢, ioc 呢,是将这个 b 呢,主动的去注入给 我这个 a, 对不对?那么这个就叫做这个,其实这个呢就是依赖注入啊,那么就是说啊,就是获得对象的这个过程啊,由自身的管理变为了呢,由 ioc 容器呢主动去注入,所以说呢,依赖注入了,是实现 ioc 的一个方法啊,依赖注入是实现控制反转的, 实现 ioc 的一个方法啊,就说在 ioc 容器运行期间,动态的将某种依赖关系呢,主动的注入到这个对象之中,这个就叫做依赖注入啊,那么 掌握了这三个啊,概念啊,就是这个容器啊,还有呢控制反转以及依赖中路这个概念,那么呢,对这个 ioc 的这个理解了啊,应该也算是了比较到位的。

就可以对我们的代码进行一个开发了啊。好,在进入到正式的开发之前,我们先把对应的这个包先把它建好啊。我这里要建一个 series, 因为我们等会要去建几个类啊。然后这几个类就是我们的 service。 我们先从服务层开始讲解好,建一个 package, 然后 service 啊 service 好 好,我们先见第一个包啊。那我们接下来再看一下这个对应的文档,这一步是不是已经做了对吧?已经做了啊。 好,我们找对应的对象啊,我们见这个的游客,然后游客这个对象实际上就是我们这个在线旅游里面的实际的一个 把对象啊。好,我们建这个游客先建一个接口啊。 实际上我们的 supreme 提倡的就是面向接口去编程啊。我们来建一个接口, i 开头代表它是接口,然后 interface 好好,这个接口建好之后,然后我们建一个方法 好。游客他有什么行为呢?他有买票的行为对不对?那就 by ticket 好好,我们先写个简单的方法啊。我们主要是为了来讲解我们的 i o c 还有 d i 啊。好。后续做项目实战的时候啊,就会写的功能会写的完整一点。 然后再建一个什么呢?再建一个实线包啊, i m p l 好。当然我们这个 呃实线内和接口有多种写法啊。啊,还有一种写法就是你直接接口叫做,就叫做这个缺我了 service, 然后你的实线内在这个缺我了 service。 这个接口后面加一个 i m p l 啊。 这种方式也是可以的啊。但是我现在使用的是这种呃,接口前面加一个 i, 然后包实线内,在我们的 i m p l 下,这个包下面。好,那再建一个实。线内 好 class, 然后创建之后,然后我们再 实现我们的接口 i travel 啊,游客类啊,游客服务类。好,把方法实现 好,这个这个对象就已经创建了啊。我等会我就要把这个病啊交给我们的 i o c 容器去管理。我这里适当性的打一句话就叫做购买门票成功。好吧, 购买门票成功。好。 好,那这个对象建好之后呢?那接下来我们是不是要去创建我们的容器了对吧?好,我们看一下怎么去创建容器啊。我们 创建容器有几种方式啊,第一种方式就是通过叉 mile 啊,这是第一种。还有一种方式就是我们的注解加上这个叉 mile 的这种形式。我在这个地方总结一下啊,创建容器啊,我这里写一个测试类。 嗯,好,先不用这个测试类啊,我们直接在这里面好,我们写一个注释啊。 啊,创建容器啊和实线 i o c 的几种方式啊。第一种第一种是什么?刚刚说了就是基于我们存的叉妙 文件。第二种注解加插庙文件的方式啊。 好。最后一种就是我们的注解啊, annotation and location 注解方式啊,纯注解的方式啊。 好,那这个就是实现我们这个 i o c 的啊,三种方式。这三种方式我们都会去讲啊,我们今天的话主要是讲这一个啊,基于我们的参妙去创建啊。 那既然基于这个参庙去创建这个对应的 ioc 还有我们的容器,那首先是不是要建一个 对吧?建一个插麦文件,我们这个插麦文件要放在这个 resource 下面啊, resource 下面好,右击,然后选择六,这里会有一个, 看这里 supreme config 对吧?如果说你们的这个地方没有 supreme config, 那是因为对应的这个 supreme 的价包你没有把它加进来。你把 i, o, c 啊,就是我们的病词,还有我们的 context 啊,这两个包把它加进来就就行了啊。然后再选择这个长庙, 点击这里,然后我们叫做 service 对吧?加一个 s, 点叉 mel, ok, 你看这个时候我们对应的这个叉 mel 文件是不是已经生成好了啊。好, 那我呃之前的视频是不是讲过,我们 super 里面它实际上最小的单位就是 bin 啊,就是 bin 啊,来这里会有一个 bins, 那我现在要创建一个 bin, 可以想象到啊。是不是直接用这个 b 这个标签就行了对吧?那如果说我想把这一个 这个类啊,游客类对吧?把它交给我们的 spring 容器去管理,那我们是不是要在这里面去定义它啊?因为我们今天是基于 chanel 啊。去创建好。 我们这里面有两个属性,第一个 id, 然后另外一个是我们的 class。 好, id 是我们对应的对象。在我们的 supreme ioc 容器里 面的唯一的标识符。然后是整个容器啊,唯一啊,整个容器唯一。然后另外一个 class, 这个 class 指的就是我们的类的权限定名。这个是 我们要把当前这个类交给我们的 ioc 容器啊去管理和创建。 ok, 那我这里就写我们的游客啊这个社会词来。 所以由我们的 supreme 啊去创建我们的并啊,是很简单的啊。那我这里写上我的内权限列名 series, 点上我的 m p l, 然后切入了 service 对吧?这个要写上我们的这个时限内啊,因为你要去 创建这个对象,你直接写接口肯定不行对不对?好,这是就是如果说你要交给我们的 supreme 容器啊,这样定义就行了啊。好,那这个就是我们的插庙啊,已经配置好了。 ok, 那接下来我们是不是要去创建这个容器?我我上一个视频不是说了吗,你把景区当成这个容器的话,我们景区他做初始化的时候,实际上就是他开门的时候对吧?那我创建容器的时候是什么时候呢? 实际上就是去加载这个对应的插麦文件的时候,还有我们闷方法去调用他的时候啊,这个时候他就去做容器的初始化了。 ok, 那我们在这里面就去做一个容器的初始化。 好。我们 supreme 里面的容器啊,有几种啊?有几种。然后我们今天主要是讲这个叉 male 啊,叉 male 的方式的容器。好, 然后容器它有两个啊,第一个是我们的 being factory, 还有一个就是我们的 obligation context。 好,我们今天用这个 obligation context a p p l i c n application context 这个可以看得出来啊,这个就是我们应用啊的容器好,叫做 contacts。 六、我们今天是叉 mail 方式对不对?那就是 class pass 叉 mail oblicating contacts 看到没有?好,这里会有一个参 数,我们的参数就传入我们的 service 好 service 点插妙 好为什么要把它交给这个 class pass 叉 mail operation 卡 max 从这个命名我们就可以看出来啊,这个容器本身就是去读取我们 class pass 下面的叉迈文件,因为我们的病都在这个 service 点叉 mail 里面啊。 ok, 那这样的话,我们这个容器就可以创建了啊,我们可以打印出来啊,打印出来 啊,直接打印 contex 啊,然后看一下它对应的数据,好让一下啊。 好,这个地方已经打印出来了啊,这个就代表我们的容器啊。看这里呢,就代表已经创建创建了啊。好,我们的容器创建之后啊,那我们这里 就要做什么呢?你其实这个地方结合我们的业务场景,你就当成是景区啊,对外对外营业了啊,营业了,那这个时候人游客 就可以进来了,对不对?那我们这个时候一样的,在这个代码里面就是我们可以通过容器来获取我们的游客对象,因为游客我们的容。呃,景区对外营业之后,游客就可以进去了对吧?进去之后我们就可以通过 这个容器来获取对应的这个游客对象了。好,获取对应的游客对象就是我们的 get bing 啊, get bing, 然后这里会有一个什么类目,看到没有啊,这个实际上就是对应的是我们的 id 啊,来 对应的 id, 这样就行了。那这样的话,我们用要用一个接口啊,指向它啊,接口指向我们这个纸类的对象叫做 travel 了。 set with 对吧?最后来 set with。 ok, 那我这里是要做一个强制的一个转型啊,强制的转型,因为它返回的是 object 来,我们转成这个对象。好,这样就行了啊。好,打包好。 然后呢,我再调用,我看这个对象是不是创建成功了嘛,我要调用他的方法对吧?调用他的方法。好,那我们再执行一遍,看有没有打印一句话。 好,稍等一会啊。 好,这里是不是方法调用的嘛,那就代表我这个 b 已经创建成功了啊,已经创建成功了。那这个就是我们的容器数字化。还有这个地方是什么? ioc 吧,对吧?控制反转嘛。 i o c 就是我们对象的创建啊,发生了反转 啊,交给我们的 i o c i o c 的容器了啊。好,我们获取这个。呃, i o c 容器里面的对象啊,还有一种方式啊,还有一种方式 啊,也是 contex 点 get b 啊,我们直接可以用这个类点上它的 class 啊,这样做也可以啊。我们这这个时候就不用去做一个强制的转型了啊, 不用强制的转型了。好,好,这样好,来再来啊,运行一下。 好,那这个也成功了对不对?好,那这个就是我们的容器的初始化啊,容器初始化,还有我们的呃, i o c 啊, i o c 就是这个病啊,通过我们的容器去做管理和创建啊, 然后后面的话会去对我们呃 ioc 就是创建对象啊的几种方式啊,去进行一个详细的讲解。

好,来看一下这道面试题, suring ioc 容器他是什么?有什么作用?优点是什么?我们通通都来回答一下,比如在之前呢,介绍 surping 的时候,我们都已经把 spring ioc 都已经差不多介绍完了,对吧? 那么假如说面试官他单独的问到你 ioc 容器他的优点是什么,他有什么作用呢?我们还可以深入的详细的回答一下,好吧,当然这道面试题呢,也是非常简单的, 基本上你去学 spring 呢, ioc 是必备的,对不对?那么我们来说一下, 那么同样的这个答案呢,我已经把同门准备好了,但是呢,徐老师呢,一般喜欢用自己的语言呢,先给同门介绍一下,好吧,那么首先 suring l c 他翻译过 出来是什么?控制反转,关键是他控制了什么?你首先要回答出来控制了什么? 他控制了什么?就是我们以前呢,我们在代码当中去创建一个对象,比如说我们创建一个 user service, 我们是不是直接 直接由我们程序员自己去扭他就完了?但是这样呢,带来带来的一个问题就是呕和度太高。然后呢维护方便, 比如说我要将这个 usa service, 我要将它改掉,我要将它改成别的一个对象,我是不是要在每一个依赖了 usa service 的类 里面都去做更改啊,对不对?这样其实就是藕和度太高。然后呢维护不方便。假如说我们要把优色设备师变成一个当立对象,因为你写的代码里面,他肯定每一次都会去用一个优色设备师,对不对? 所以说我们要去维护对象的话也不方便。 我们现在引入了 suring ioc 之后呢, 引入了 ioc, 那么就将创建对象的控制权呢,交给了 three, 所以说 lc 控制了什么?他控制了对象的一个创建的权利。 那么以前呢,有我们程序员 程序啊,自己呢控制对象的创建,现在呢, 交给 suring 去创建了? 交给 spring 的 lc 去创建了。那么如果我们要去使用, 就需要通过什么?通过 di, 也就是依赖注入,对吧?我们只需要 哎依爱,你给我过来,怎么叫通过? out 外的,我吼一句,对吧? outy 的我需要用到这个对象,那么就会通过 di 依赖猪物的方式呢? 从 lc 的容器当中帮我们自动注入进来,奥特外的,我们称之为自动注入,对不对?那么这样一回答之后呢,你基本上就已经把 ioc 和 di 以及自动注入这几个概念呢,通通讲明白了,对不对? 所以说控制反转,他其实就是控制了对象的一个创建的权利,为什么反转了呢?以前由我们程序员创建,现在呢,交给了 spring ioc 去创建。那么如果我们要去使用对象呢? 去使用,如果要去使用对象,又需要通过 di 依赖注入,那么 di 的一个体现呢,就是通过奥特外的自动注入进来,那么我们就可以呢, 自动注入就可以呢使用这个对象了,或者说病,对不对? ok, 这是 ioc, 它的一个概念,它它的一个作用, 那么他的优点呢?我们刚也说了,对吧?他的优点就是 集中管理了我们的对象,方便呢?我们维护。 如果我希望某一个对象变成单立,我不需要做任何的操作,因为我们 suring 当中的病,他默认就是单立的,对不对?然后呢,如果你希望他是懒家,就是懒汉模式或者恶汉模式呢? spring 的 lc, 他的一个病呢,他都是支持的。 ok, 当然这个懒汉恶汉,这个是属于单立设计模式当中的两种方式啊。好吧,这个如果你不知道的话,你就直接跟面试官这么说就行了, ok, 方便维护。然后呢,我们刚刚说了,嗯,结藕对不对?降低藕和度, 这其实就是他最大的两个优点。 ok, 那么这就是 siri 它的一个作用,以及呢?它的优点以及呢,它是什么?它就是控制反转,对吧?那你可以说按照我刚刚所说的这个思路啊,它控制了什么, 对吧?他其实就是控制对象的一个控制权利,之前呢,由成像自己创建,然后交给了 suri lc 去创建,然后需要用到的时候呢,就通过 di 依赖注入,对吧?通过奥特外的自动注入进来,我们就可以直接使用对象了,那么他的优点呢?我们有点 就是集中管理对象,方便我们维护。二呢,降低了他的一个额度。 ok, 这个呢非常的简单。

或者说如果是你来设计,你会怎么思考这件事情?你会怎么思考?没有意思吧?你想一下,有一个容器,这有个大框,是我的容器,这个容器里面,好吧,我要去放置我们对象,对象什么样子? r c r v。 假如这些东西都是我们对象,你想一下,在容器里面有对象之后,我可以通过我们一系列的客户端 kind, 我们再讲课,课务端,好吧, kind, 我要从里面开始进行一个获取操作了。那些问题来了,你在获取之前他必须要有吧? 就跟同学说而已啊,老师,我要结婚了,你要结婚的前提是啥?你要先有个女朋友吧,女朋友都没有,你结什么婚?这一样道理吧,所以这块也一样的,在容器整个环节中,你启动好 当前这个应用程序之后,里面已经包含了某些对象,而我用的时候直接从容器里面直接获取就可以了哈,直接就获取就可以了。所以这个时候你要思考一件事了,那是不是意味着我们当前这个容器包含了创建对象这个过程?所以第一个问题来了, 对象谁创建的?谁创建的? supreme 容器吧? supreme 容器来创建对象。好,这第一个问题好了,第二个问题,对象啊,如何创建? 你告诉我对象怎么创建啊?这个画面也叫 process on, process on, process on。 好吧,现在自己看。 这是哪个老师啊?不是马士兵吗?不是,我是连老师。好吧,对象怎么创建?你们接触过哪些方式?接触哪些方式?最开始的时候有 的方式可以直接 吧。好吧,除了 之外还有什么方式? 你通过工厂的方式是不是也可以来获取我们当前这个对象?同时还可以通过什么?还可以通过反射的方式,有三种方式都可以用来做,而你们其实之前如果了解过一丢丢底层原理的话,应该知道在 ioc 里面创建对象的时候是怎么创建的,你告诉我 啊。反射吧,是通过反射机制,所以反射是我们非常非常重要的一个模块,你必须要对反射足够熟练啊,才能了解底层的一些原理。那我们这写一个最基本代码吧。 怎么来反射呀?或者说反射代码我应该怎么写啊?怎么写?这道东西你们应该写过。好吧,我来写一下,第一步叫什么?某一个类。呃,直接写吧。 class, 比起哪一个 person 类吧。 person, person 第二 class, 然后呢?获取到一个大写 c 的一个对象,这第一步,好吧,有它之后,第二步可以干嘛? class 第二, get declare, d, a, r 哎, get constructor 吧, 这干嘛的?是不是能获取到一个构造器对象? s t r u, c t o r c t o r 等于它是不是通过构造器?有了构造器之后,下一步我再怎么做,我是不是可以通过 c t o r 点 new instance 来反射生成我们当前的对象吧。再写一个 object, o, b, j 等于这样的方式。这三行代码能看懂吗? 没问题吧?这是我们之前学过的最基本的一个反射的一个方式,这东西如果你看不懂,麻烦了,麻烦了。好吧,所以把这东西一定要熟练了。

史不润 ioc 容器起到流程是怎么样的?好,那我们来看一下。那么通过阅读史不润的圆码,我把它的核心流程已经做了一个总结。 那么这个原版呢?是基于注解方式实现的史布瑞 lc。 那么总结起来啊,就这么五步。第一步他创建一个啊容器上下纹。在创建这个容器上下纹的时候呢,他会创建一个 默认的 lazable b factory, 然后接下来创建好这个默认的 lazable b factory 之后,他就会解析和扫描内上面的注解, 并且将所有 b 封装成 b 的分类型对象。那么这个 b 的分类型对象封装了史布瑞所有的 b 的相关第一描述信息。然后接下来对史博瑞配置的所有 b 进行实力化,也就是创建这个 b 对象,根据 b d 翻地形这个对象的信息,底层采用反射啊,创建具体的这个 b 对象。好,那么最后就是把创建好的这个 b 对象放入到一个卖部中, 后续我们一有程序就能够从这个迈普中拿到这个逼对象,那么这个迈普就是我们史不论的 ioc 容器。

如何实现一个 ioc 容器?那么实际上这道面试题呢,考察的是我们程序员对这个 ioc 容 器的一个理解啊。那么实际上如果你理解了这个 ioc 容器在这个十分钟到底是一个什么样的位置对吧?那是做什么用的?那么实际上呢,你 把这个 surme 实现这个 ioc 容器这个思路把它讲一下,其实就可以了啊,不会真正的让你去实现一个 ioc 容器。当然只要简单的说一下这个思路就可以了啊,不是说 你每一个点都要去达到,那么是不是的中间那个艾欧斯容器呢?相当之复杂啊,你如果每一个点点点面面俱到的话,那么这个肯定呢就不太适合,而且呢会给自己挖坑啊。那么应对这样一个问题,我们怎么样去回答呢?如何实现一个艾欧式容器?当然了,不同的人可以有不同的见解啊。那么我这里呢 给大家呢归纳了一个比较,就是比较简单啊,就是不会挖,不会给自己挖坑的一个比较简单的一个描述。 首先呢第一步呢,就是我们呢要写一个配置文件,你可以这么去说啊,第一步我就写一个配置文件对吧,然后呢配置一个包扫描路径,然后呢我呢 根据这个包扫描路径的我去读取这个包扫描路径吗?然后读到这个包扫描路径之后呢,就地归这个包路径对吧,去获取这个包路径下面所有的这个点克拉斯文件,然后呢去反射反射这个点克拉斯文件。然后呢确定呢需要就是你这些点克拉斯文件,哪些呢?是需要交给这个 lc 容器去管理的,把这些累了找出来。 然后呢对需要进行注入的类了进行这个依赖注入。实际上呢,总体来说就这么四步啊。当然你可以说的更详细一点啊,比如说啊,配置这个文件对吧,指定这个包路径,然后呢定义一些注解对吧?定义一些注解,比如说 把这个访问控制成的注解啊,业务服务成的注解啊,持久成啊,以及依赖注入啊,对吧。还有呢获取这个配置文件的注解等等等等啊,把这些配置 注解定义出来。然后呢从配置文件中呢获取了需要扫描的路径对不对,然后呢把这个文件路径下面的这些文件信息啊,以及文件夹信息都把它读出来对吧。然后将当前路径下所有的点和拉屎。结果也是这个文件添加到一个赛的集合,然后去存储。 然后呢去便利这个赛的集合获取了在这个类上面有指定注解的类,就是我们上面定义的这些注解对吧?根据这个注解呢去做这个解析啊。 然后呢把这些类呢交给这个 ioc 容器去处理。那么这个 ioc 容器呢,我们可以定义一个卖部对吧,定一个卖部来存储了这些对象,就是把这些对象呢把它实力化,然后把这个实力实力呢放到这个卖部里面,这个卖部呢就作为我们的这个 ioc 容器啊。然后呢再去便利这个 ioc 容器 再乐趣获取到每一个类的这个实力对不对,然后再去判断里面是否有这个依赖其他类的这个实力,然后去进行这个地规的一个, 就是进行我们的那个依赖出入啊。当然了,这个回答呢,比较的简单啊。当然如果你要说的很复杂的话,这里边呢可能还会涉及到什么呃,这个呃 循环依赖对吧?还有呢,比如说我们这个街头猪肉等等啊。当然这些问题呢,就比较复杂了。那么呢,如果说只是简单的回答一下,就是如何去实现一个 ioc 容器的一个简单的思路。那么呢,其实回答出这些问题了就已经啊可以了。