今天威哥跟大家说说 spring 的创建过程。在 spring 容器启动过程中会调用 abstract application context 的 refresh 方法,该方法是 spring 容器启动的核心方法,其中 spring 的创建就是在该方法的 industry being factory initialization 方法中进行的。在 spring 的创建之前,其实 spring 在 refresh 方法中就已经为我们做了很多的铺垫,比如说生成 individation 并存储到一个 individation map 对象中,接着合并 individation, 接着将 spring 容器中内置的 being post processor 和扫描得到的我们自定义的所有的 being post processor 添加到一个叫做 being post processors 集合对象中。基于上述三点的铺垫工作, 不用容器就可以根据合并后的并地分 nation 进行并对象的创建了。 接下来让我们根据源码梳理一下 spring 中一个兵创建的完整流程。第一步,实力化前在兵的实力化前, spring 会为我们提供一个扩展点,我们可以通过该扩展点在兵的实力化之前或者实力化之后完成一些自己的业务逻辑。 第二步,实力化。接下来就可以根据 indeed fination 实力化并对象了。该阶段的主要执行逻辑如下,首先判断该 indeed fination 中是否设置了 supplier, 如果设置了,则调用 supplier 的 get 方法获取对象。 如果没有设置 suprel, 则会检查该 b d v 内饰中是否设置了 fex 纯白色的。如果设置了,则会调用工厂方法 获取对象。如果也没有设置工厂方法,则会执行推断构造方法,根据推断出来的构造方法实力化编对象第三步, beetf nation 的后置处理实力化编对象之后就可以为其属性复制了,不过在属性复制之前, spring 为我们提供了一个扩展点, 我们可以通过该扩展点对此时的 be indefination 对象进行加工。 四、实力化后,在 being different nation 的后置处理之后, spring 又为我们提供了一个和步骤一种完全一样的扩展点,通过该扩展点,我们可以实现在 being 的实力化之后完成一些自己的业务逻辑的功能。 第五步,自动注入这里说的自动注入主要指的是 spring 的自动注入。关于什么是 spring 的自动注入,可以参考如下代码片段。 六、处理属性该步骤也是通过 spring 提供的扩展点实现的,它会处理 auto wire 的 resource value 等注解。通过实现该扩展点的 post process property 的方法,我们甚至可以实现自己的一个自动注入功能。 七、 over 接口回调一来,注入完成后, spring 会判断该对象是否实现了 be name overwhere being class load overwhere being factory overwhere 接口。 如果实现了, spring 就会相应的调用 set bean name set bean class loader set bean factory 方法,并传入相应的 bean name being class loader being factory 参数 八、初始化钱该步骤会便利 being post processors 对象并执行他们的 post process 比方引力数来 zechian 方法,其中 any 的 destroy annotation being post processor 后置处理器会在该步骤中执行 被 post construct 注解声明了的方法。九、初始化该步骤首先会判断当前兵对象是否实现了 initializing being 接口,如果实现了, 则会调用当前对象中的 after process set 方法。另外,如果我们配置了初始化方法,那么该方法在此步骤中也将会被调用。十、初始化后,该步骤会便利并 post process 对象并执行他们的 post process after initialization 方法。 在该步骤中,我们可以对病进行最终的处理,比如 spring 中的 aop 就是在该步骤中实现的。我们可以将上述的十个步骤进行精简,移除。第一、 三、四步合并。第五、六步为属性填充。经典后的步骤如下,一、实力化。二、属性填充,也就是依赖注入。三、偶尔接口毁掉。四、初始化钱主要是 being post processor 的前置处理。五、 初始化主要是引力数来自应并接口方法的回调和自定义初始化方法的调用。六、初始化后主要是 being post process 的后置处理。关于死追硬兵的创建过程,威哥绘制了一张流程图以供小伙伴们参考。 此外,对于非揽加载的单立并揽加载的单立并以及圆形并他们创建的过程也是有区别的。一、 非揽加载的单立并是在 ioc 容器初始化的时候完成创建的。二、览,加载的单立并也就是设置了 lazy 引力的属性,或者是使用了 lazy 注解的病。这类病 ioc 容器初始化的时 我并不会创建,当使用的时候才会去创建。三、上面的这两种单立并创建完之后会被存入到一个卖铺中,我们称之为单立池。四、圆形宾,也就是设置了 scorp 属性为 prototype 的,并 这类病每次使用的时候都会创建一个新的病对象,并且 spring 容器并不会管理这些病。小伙伴们,关注威哥,更多精品内容持续与你分享!
粉丝2606获赞9403

好,接下来我们来看一下这一道比较重磅一点的面试题,它的难度系数呢,我也是直接拉满了,反正很多的一线互联网公司啊,都有问过他,据我知道的,你像这个蚂蚁金服二面美团好未来啊等等都问过这道面试题, 更别说一些个三四线互联网公司小公司了。基本上凡是问到 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 呀,还是你使用的奥特曼的给你进行自定义, 进行自动注入的这种注解的解析,总之呢他会把你的这种依赖注入的属性呢,在这一步给你进行注入进去, 好吧?然后最终呢进行初始化,那么在初始化这一步呢,他会去调用,他会。

spring 中的病的生命周期有哪些步骤?那这个概念其实我们前面提到过啊,我们提到的是实力化和初始化,但是我们前面其实也大概看过一些原码,在他的原码里面其实有很多的步骤啊,我们这边总结一下, 对了,本视频的文档我已经整理好了,并且与往期内容一起汇总成了二零二三年最新加法面试文档,放在了视频的最后面,坚持看完一定对你有帮助。好,那我们继续。 那首先,首先并的创建就是 supreme 是如何创建出来一个并对象的,那么我们说了它会有一个实力化,就是利用比如说我 youtube service 里面的 过程方法去实力化出来一个对象。那如果说我一个类里面有多个过程方法呢?啊,那么死不认他到底用哪一个呢?哎,这就是我们讲的 腿断过这方法我这里大概举呃一个小小的例子好不好?好,我们来简化一下我们的代码 啊,我们这边来注入我们的 order service。 好像我代码如果这么写就表示 只有一个无偿的购置方法。那如果说我的代码这么写呢?啊,有人说那不是有两个吗?注意错了,这个还是只有一个,就他懂吧,所以只有一个啊。那么现在 spring 他会不会用这一个呢?啊?我们来打印一下这个属性,以及我们在这边来打印一个数字就是一。 好,然后我们回到我们测试的地方,我们先来试一下啊。嗯,哎哎,正常的。所以说,呃,我现在 usb 上是一个病,而 supreme 它会来调用这个购置方法来 来得到一个对象。对,那么假设我现在再来把我们的无偿的歌词方法把它给放出来,那现在会用哪一个呢?现在有两个歌词方法,那么 supreme 他该选择用哪一个呢?我们再来运行 好来打印是零,所以说,哎,有了无畅的,他就会来用无畅的了,那为什么呢?凭什么呢?对,为什么你不用下面这一个的呢?刚刚还可以用啊,所以说这个我们等下来总结啊,我们再来写一个这样子, 这是有两个参数的勾字方法,对吧?好,我们把它答应一个二,好,现在会用哪一个呢? 好,来发现报错了哈,顺序说,呃,如果说是这种情况,他会报错,这是为什么呢?啊?这个,呃,我说的这是推断购置方法,很明显我 在一个类里面有多个构字方法,那么 spring 它其实一开始它是不知道用哪一个的,就除非你用我们的 auto y 的注解去指定, 就是我明确的告诉 spring 你要用哪一个,那么 spring 他就会用哪一个,看到没?如果指定在这里,那么他就会肯定会用上面这一个,但如果说你两个都指定呢,那么肯定就会报错,对不对啊?比如说我们再来运行一下, 好来两个都指令他就会报错,所以我们可以通过这个方式,如果有多个购置方法的情况,下面可以通过这个注解来指明 spring 你到底用哪一个。如果说你没有指明,那么 spring 他会去 这多个个正方法里面去找看有没有无偿的,如果没有无偿的,那么 spring 他会报错。如果有无偿的,那么 spring 他就会用 武昌的,因为武昌的有一种默认的意思在里面。对于 spring 的理解就是陈轩,你没有明确的告诉我要用哪一个,那么我就会去用那个默认的武昌的告知方法, 就这个意思,如果说你又没有指令,你又没有无偿的,那么我就只能报错。当然如果说你一个类里面你只有一个,那么就没什么好说的, spring 他就直接用这一个,所以这个叫做推断过错方法,就是先 选择歌词方法,选择好了之后,我就去调用这歌词方法去得到一个具体的对象,得到对象之后,那么我们就会进行 依赖注入,给对象里面那些加了 autobio 的注解的属性去复值,然后还有回掉, over, 回掉 over, 回掉其实很简单,就是你可以去实现一些些接口,比如说我们的 application context 的 这个还不算是 over 啊,真正的 over 应该是这一个,那 being factory over, 你实现这个接口,那么呢?哎,你就得去实现它里面的这个方法,那么这个方法最终是 supreme 来调这个方法,那哪一步呢?就在这一步, 就是这一部 supreme, 它会来调用你 youtube service 里面的这个方法,并且把当前的并工厂传给你这个方法,这个方法你拿到并工厂之后,你想干什么,你自己去处理就可以了, 懂不懂?所以说这是我们的 ovl 回调,大家类似的还有什么 bin name, lvl, 现在还有很多其他的 ovl 都是这样的,相当于我把我 spring, 我把我内部的一些东西, 哎,我,我通过这个方法,我告诉你,告诉给你当前的呃开发者或者说余额设备时,可以这么理解好,然后,呃,我执行完这些 ol 的方法了之后,我们就会来处理这个注解,而这个注解相当于我, 我可以在一个个字方法上面,哦,或不是我可以在某一个方法上面,比如说这里有个 a 方法,那么我可以在这个方法上面去加上我们的 pose ctrl 注解,这个法什么时候会执行呢?啊?一样的,就是在我们刚刚这个步骤初始化前 会来执行加了这个注解的方法。好吧,我们来试一下,我们现在并没有手动的去调用我们的 a 方法,那 a 方法里面的内容它会不会执行呢?我们直接运行, 哎,幺幺打印出来了,看见没?这个属性肯定是空啊,因为我没有进行依赖注入。对,所以这是猝死化钱,那么猝死化我刚刚讲了就实现这个接口,那么还有一个 就是把这些动作都做完了之后,就会进行初始化后啊,这里面呢就会去进行 aop, 最终就会得到我们的代理对象啊,这种代理对象他就会成为我 我们说的病对象。当然如果说你不需要进行 lp, 那么就是我们前面实力化出来的这个对象会最终成为我们的病对象啊,所以说这是大概的一些步骤,实际上,嗯,病的生命周期里面其他有很多哦,我们讲我们这里还只是病创建,其他有病销毁的生命周期 啊,所以这个呢?呃,可能问的不是那么多吧,所以大家感兴趣的可以自行的去。呃,我这个图其实也有啊,可以再拿到这个图好好的去看一下。其他有很多其他的一些步骤 啊,比如说实力化前,对,我也没有说啊,实力化后我也没有说,还有填充属性,就是依赖注入之后我我也没有详细的去讲,包括合并病例、分类型等等,所以大家可以自行的再去了解了解吧。

啊,大家好,我们再来看一下一个更深入的一个问题, supreme 框架中病的创建过程是怎样的?其实这是非常非常经典的一个面试题,从基本上从 suprem 出来开始就一直在问这个问题,很多互联网大厂在考这个 supreme 底层框架的时候,基基本上这个也是 必问的一个问题,因为整个 supren 框架它核心就是围绕这个病的管理,对吧?而在病的管理呢,整个过程当中,创建是最为复杂的一个部分,我们有很多很多的逻辑都需要在创建过程中去去进行, 那这个问题其实就是考你怎么样对 supren 容器整个 suprem 框架的一个了解程度啊,没有太多的这个花俏可言,就看你理解的一个深度了。当然啊,其最好的方式还是什么?就建议的就是去读研吗?整个创建过程其实都是分散在啊我们 上面提到的那个十分容器初始化的过程当中的,所以最最有效最全面的理解依然是什么?读研吗?啊?当然如果你读不出的话,还是需要有一个这么简单的一个抽象,那我们这里呢就带大家把这个呃整个这个创建的过程呢,我们把它全面的来梳理一遍。 那首先简单来说, supreme 框架中的病经过四个阶段, 一是实力化,相当于实力化,就相当于先溜出来,对吧?溜出来然后属性复制, 就对他使用的一些有依赖关系的属性进行复制,然后呢进行初始化,我们可以在呃容器处 说实话过程中定制每一个病的一些初始化的逻辑,比如说有一些我需要加载内存,对吧?或者有一些需要,呃,有一些别的这种加载逻辑,都可以在初始化阶段进行定制,那最后呢就是销毁了, 销毁相对来说还是一个比较容易的一个过程,对吧?但是我们在使用的时候也经常会要注意有一些这种销毁的逻辑,一定要,比如说有些病不用了,我要释放内存,对吧?好。然后具体来说 suprem 并中并经过了以下几个 几个步骤。首先第一呢是实力化, 这个相当于就是由 supreme 框架来帮你扭出来这些对象,对吧?那这个没有太多说的,这你主要的主要的主要注意的是什么呢?就他的两个,这个两个十几, 一个是。呃,当客户端,向客户端吧向容器申请一个病时会要去初始化,还一个呢就是当初始化容器 在初始化一个病时发现还需要依赖另一个另一个病,这时候也会进行初始化。 那比如说你看我们这个小呆帽里面,我,我客户端需要用扛碰的正面有生命证件跟 a, 那 a 肯定会露出来,对吧?在初始化 a 的过程,当 发现他要注入一个 b, 但这个 b 的呢也会把它促使化,这是两个这个实际。然后呢我们还要注意,就是 如果你想要去看原码的话,可以看到整个这个病啊,其实就通过我们上一个阶段调到那个 spa 呢? ska 呢?去扫描,扫描完了之后呢,所有的这个对象的配置都会以病的分离选 这个对象的形式保存整个关于这个并的一些信息,然后并通过这个并带分的选来对这个对象进行创建,就并带分的选,他是个从名字看到是并的一个定义吗?所有这个关于这个对象的一些语言信息, 用来管理这个对象的一些配置信息,全都放到了这个病在非你选里面,然后通过这个非你选来说实话实力化所有的病相当于是做这个六的这个过程,当然他不可能 直接去六,对吧?这个是用反射去实现的。然后第二个步骤就是设置对象属性, 这是依赖猪肉, 那这个就是啊, supreme 根据这个病在分类选中的信息去找到对应的属性,对吧?把它注入进去, 这个就没有太多,可这其实就是一个依赖猪肉的一个过程吗? 是不是你通过病 带分离线找到 对象依赖的属性,依赖的依赖的其他对象,并将这些 对象赋予当前, 然后接下来是处理一些 ovl 接口, ovl 接口是什么呢? lv 接口其实表示对什么东西敏感,对吧?那 supred 呢?会检测对象啊,检测对象是否实现了叉叉叉这种 ovl 接口, 如果实现了的话就会调用呃,对应 的方法,那有哪些呢?我们常用的,比如说我们看一下, 这就是欧威尔这个接口,它是一个接口,对吧?它里面呢会有一些子接口,比如说我们常用的有这种 英普联盟 bennowey, 这样可以干嘛?就可以晒的 benm。 把并的名字 大家知道,我们在使用器当中,如果你没有设置名字的话,默认是什么?就是按这个名字的一个小写,对吧?那如果你是设设置一个呃 a 这么一个克拉斯的话,那在容器中就会有一个小 a 这样一个对象,对吧? 那我们在这里呢,就可以呃, get 病的时候就可以传一个这样的小 a, 对吧?那是通过这种方式,当然这里也做类型转换了,对吧?啊?那通过这个辩论都为了这个 接,可能就可以给他设置这个并到容器中的名字,比如说我就不设这个小 a, 所以制成 tyse 这样也是可以的,对吧?啊? 好,那我们这个不去做这个, 那我们就不去做具体实验了,我们只是只能提到这个方式,那有哪些常用的呢?比如说,呃,并内并内而外啊, 接口可以给对象那个名字去传说病的名字,对吧?还有哪些常用的?比如说病克拉斯 logo, 喂?啊, 那这个就是传什么?传一个普拉斯 logo 吗?传一个内加载器吗?对吧?当我们需要去对内加的机制进行扩展的时候,就可以用这 这个,比如说有些什么场景呢?比如说我们的 tom cat, 对吧? tom cat 就是一个典型的这种哎,自定义内在的这个场景, 他本身他是一个加我程序,然后他需要加载他微博 app 目录下那些应用的那些,呃,各种各样的克拉斯,对吧?所以呢他就需要扩展一个克拉斯 logo 这种加载机制,那就可以通过这个接口来进行扩展。 那另外呢,还有一些啊, supreme 底层的这种自定义的扩展,比如说并翻个头, 这个就看嘛,可以扩展这个病 facetoy 吗?对我的整个病的管理进行扩展。然后呢?还有呃,不利可以选 comtx ov。 啊,这个就是可以设置这个啊?不,你可以选 cx 的上下文,那通过这个上下文呢,就可以对, 比如说多个时配容器进行管理。当然啊,这种多个时配容器的管理呢,我们平常中平常开发中用的是比较少的,这个是相当于是对时配的一个深度定制的一个使用了。 好,那我们接下来再看。呃,下一步,下一步就是并 post 的前置处理,并 pose pro cs 呢,是并提供的一个 super 创建一个钩子,比如说给大家搞一个小例子, 我们这里就不需要了啊,然后呢,我们在这里面自定义一个 买饼,不是四 s, 然后呢他就可以英普联盟 并 poss, 这个时候我就可以实现选择实现他的一些方法, 那他就是有两个方法,从名字就能看到 pose plussb fo 一定选 lc 型,就在初始化开始之前的一个处理方式。然后呢还有一个是 posepross ft 一定选 lc 型,初始化之后做的一个方式。那这里呢, 我们可以拿一个小的一个简单的一个例子,并呢就是他要代理的一个对象啊。 然后呢我们这里打一句话, 好在这个下面呢给他一句话, 当我们在有了注册进去这一个,还有生命把它注进去啊,好,把有这个钩子注册进去之后,我们就可以来看一下这个创创建的一个过程, 这个过程他会创建 a 和 b 两个实力,对吧?我们看到你看在出在实力化 a 和 b 的时候,其实都进入了这个钩子,对吧?都进入这个钩子了,所以就执行了这个方式,那这就是在这个步骤完成的 并 pose 这个方法,这方法比较长啊,我也记不住 并 pos 的逼货引领选来任选方法,接下来呢,就是 啊,与你说,来来人并 supreme 检测,如果,呃检测对象如果实现了这个接口,就会 执行他的阿福特 praprapsat 方法 定制初始化逻辑,我们也可以来试一下。哎,你选了 z 选,我们对这个克拉斯 a 呢? 英普联盟主义力学来认定 针灸线上的这个,呃,所有的属性注册,注册,注入完了之后来执行这个,那我们打一个, 嗯,就打赢这个,一定学来人兵吧,我们再来看一下 啊,这里正看到我在初始化这个 a 的时候给他注了这个初始化方式,那他在在 a 这个初始化过程当中就会注入一个,引起来一诊病,对吧? 好,那呢,接下来 接下来就到了这个 amit max 的, 就我们之前在用并标签去配置属性的时候,我们是配一个伊尼特 max 的,等于叉叉叉,对吧?哎,这样一种方式, 那这就可以定制他的一个哎初始化的一个方法,那在初始化的过程当中 就会调用这个方法去执行初始化,如果并啊 suprem 发现并实现了这个定配置了这个属性,就会调用它 他的配置方法执行初始化。 执行初始化逻辑, 这是一桶面水,那他 通常呢,我们是用这种插妙方式可以配置,对吧?那对于我们的注解呢,我们就有一个 pose clux 这一个注解,比如说我可以在 a 这个方法里面 pose coms pose ctrk 这个珠子还拼错了啊, 这个注解就对应这个注解,也可以定制这种初始化的一个过程, 然后呢,最后就是这个病 的后处理了,那这个 其实刚才已经看到了,对吧?就是就是调用这个并 pross 的这个 pose, prossift 引流选来人选, 其实整个呢,到这里这个病的创建过程就结束了,就完成了, 病就可以正常使用了, 也就是说整个病的创建过程就这七个步骤就已经完成了 啊。然后呢,其实后面还可以补充两个,就是什么他的一个,呃销毁,销毁呢? 下回他有一个也有两种方式,一个一个的是 polo 并 你是 pose 不病,这个呢就跟伊尼轩拉一种病是对应的,对吧?就是他的 一个呃,当并实现了这个借口,在销毁前就会销毁前就会调用他的一个 的是错与方法,那这就没有太多可视的了,对吧?啊?最后呢是一个销毁, 所以卖死的,那也就对应我们其实就对应这个伊利特卖死的是对应的,那有对象有这个初始化的方法,也就会有这种销毁的方法, 那可以进行一些内存回收,对吧?啊?这一些一些动作,那同样呢也对应一个 pro 也这样一个注解, 比如说我们可以在这个方法上我们来看一下 普瑞迪斯座注解,那这个注解呢,也是对于那个方法,那这呢,这就是整个这个 啊, supreme 对于这个对象的一个创建以及销毁的过程,其实在这个过程当中大家要注意啊,这里只是简单的列出了这个过程,实际上在每一个过程当中都还有非常非常多的细节 是需要去考虑的啊。比如说你实际上你看在定义一个实力化的时候,我们到底是另一个对象呢?还是到底是 到底是又一个对象,还是创,还是返回创建 一个动态代理, 这就是需要考虑的,对吧?其实让我们所有对象大家都知道,不光是六种形式,如果配了 lp 这种切面的话,那肯定就是一个动态代理对象,就不会是六这么个对象。然后还有很多,比如说 这个 bmpos 的 pross, 我们现在是只有一个 bm box 的 parss, 那如果有多个呢?他的顺序怎么保证?怎么执行的,对吧?还有很多很多哎,其他问题都可以从这个过程当中把它隐身出来。还有比如我们后面讲的这个循环依赖这个问题,也都是在这个过程中需要隐身出来的,当然最好的方式就是去看一下原码, 呃,也可以带大家简单的看一下这个圆吗?比如说我们的这个启动过程,通过 cometix 去 get 病的时候,实际上可以找到很多他一些呃,我们 对应的这些代码,比如说你看到这是 get 并 fatt, 有一个并 fatt 去拿到一个并,对吧?那这个并 fx 的时间在哪呢? 而不是瑞克的病, fak 就在这个过程当中,其实我们看到很多像 crubing 创建病的过程就在这里啊,他虽然而不是 chut fux 的病呢,他是一个抽象的,那肯定要有他的子类,他的子类你看其实也只有一个,那整个下面呢,就是他创建的一些过程, 整个创建的一些过程,这也是跟原码的一个方式,比如说你度会的病,这就真正去实现一个创建操作了,对吧?啊?那这呢就不带大家去深入理解了啊,只是说大家呢要根据自己的这个 呃理解的一个程度,把这个问题看怎么跟面试官回答全面一点。好,那这是关于这个啊, supren 容器的并创建过程。

好,那我们继续啊,到这呢,我们把 spring 配置非自定义并也讲完了,那我们下面看下一个关于并的时尚开发基本流程啊,从这开始呢,我们就进入这个 spring 并的一些底层的学习呢 啊,这原理性啊,底层性啊啊,原码的然后学习,所以大家然后注意听这块也是你跟别人然后在 spring 这块差距的地方啊,拉开差距的地方。好,那下面我们看一下,说这个病呢,然后时常开发基本流程,那这什么意思呢?其实简单的讲, 主要给大家讲的是什么呢?就是说,呃,回到我们这个代码区啊,就是说你在这个地方是配了一个并对吧?这个并后期是不是要变成一个对象,存储到死病容器当中? case 吧。那这个过程是怎样的?哎,我们主要是讲这个过程啊,就是从标签配置 到最终进入到容器当中,你在 getaway 时能从容器箱拿到这个并中间这个过程啊是怎样的?我们需要给大家讲一下。好,回到我们的 pp 箱。这我写一段画啊,这段画呢,我们简单去读一下啊, 说此么容易,在初始化时会将插苗配置的并标签的信息封装成一个并地方念是对象啊,这什么意思啊?我们知道扎不是面相对象的对吧?然后你在你的插苗当中会配置很多这个并标签,对吧?我们看看简单的吧,把这个然后注掉啊, 我们看下之前我们配置的这个,我们拿到上面啊,就是一个 do 啊,一个 series 是吧?哎,你配置很多病标签,那这个病标签的信息他想最终能这个参与运算是吧?他是不是得放到一个对象当中,又扎 面向对象的嘛,对吧?所以说这些信息要干嘛呢?要被封装成一个对象 啊?封装,这并不是说这个 u 字 do 对象本身啊,他是封装这个并信息的那个对象,因为这个信息本身也需要进行存储吗?在内存当中,是吧?所以我以这个对象的方式封装这个并的信息,这,这能明白吧?我说过不是这个,并不是这个 u 字 do mpl 这个对象本身 啊,是封装然后这个并标签信息的这个对象。哎,那这个对象叫什么呢?这个对象其实就叫并 definition, 我们把翻译成中网叫并定义对象 啊,就是定义并的啊,封装并标签信息的这个对象,我们把叫做并定义对象,你知道,然后在这个地方是不是存在很多并标签啊?那就意味着每一个并标签是不是对应一个 been definition 就并定义对象,那这不很多并并定义对象吗?那每一个并定义对象啊,又被存储到一个叫并 definition map 的 map 集合当中, 这能明白吧?啊?就是一个病,标签儿就用一个 indiffination 对象封装它的基本信息,而很多并 definition 对象最终存储到一个 map 当中,这个 map 叫什么呀?叫 indiffination map, ok 吧?那么这个 indiffection 的 map 在哪维护?其实就是在我们的 bifactory 当中进行维护啊。 bifactory 当中进行维护。好,接着再看。那你放到麦当劳干嘛呢?哎, sbring 这个框架呀,汇聚这个 map, 然后进行循环, 取出每一个 indiffination 这个对象,拿到 indification 内部封装的信息,对吧?哎,主要 拿谁啊?其实对于我们而言,我们现在稍微,然后更容易理解,就是拿这个权限的名,对不对?为什么要拿他呢?因为拿到他之后,我要通过反射去创建对象, 对吧?哎,所以说在这,哎,我们 spring 框架要对这个 map 进行什么呀?进行循环,然后取出它内部的这个封装的这个并 dividation 内部封装的并的信息,然后使用反射去创建对象。 那每创建好的一个对象是不一个 object 的吧?那这个对象又是存到哪的?又是存到一个名为 叫 singleton object 撕的一个 map 集合当中,这个我们发现成中文叫什么叫当立时,哎,之前其实我们在讲个事,是不也遇到过,是吧?那这个当立时,这个,这个就像就是他这个卖部啊,他在哪维护着呢?也是在我们的 bifactory 当中去维护着这 map 的一个引用, ok 吧?哎,到这为止我们就知道呢,你这个标签,首先我要提取这个标签对应的信息封装成一个 being definition, 然后所有的 definite definition 存到一个 map 当中,是吧?然后再对这个 map 呢进行循环,然后取出每个 be indefinite 的信息, 然后通过他的信息去反射创建,然后变对象,再把然后创建好的对象放到一个当地池当中 啊,这当地时也是个卖法,是吧?哎,这些都在我们的这个 befatry 当中维护着,那相当我这个币是不创建好的吧。当你去调用 get 并的时候, 那其实是干嘛?是不就是根据那个名字,因为 map 嘛, map 本身是不是建筑队啊?就根据那个 key 的名字,然后从你的 map 当中去干什么?匹配对应的并,然后匹配成功之后 就你返回,那匹配不成功呢?就报一错吗?就没有可用的名字,就找不到,对不对?哎,其实说白呢,就是这么一个过程啊,这么一个过程,那这个过程呢?呃,我们可以看一下是吧?我们可以看一下。那怎么看呢? 稍等啊,在这个地方我打一断点,哎,打断点我不搞这么复杂呢,这些我都把它删掉。啊,这都不要了啊。不搞这么复杂,我就找一个 user service 就完, 对吧?找 user service serious 强转成 user service, ok 吧。在这儿打一个断点打一个断点啊,让我们再看。再看什么呢?再看在我的配置当中,我把其 加的啊,把这个,这是 south 也注掉啊。在现在整个文件当中是不就剩一个 user service 跟 user d o 吧。好,现在我第八个去运行它,走 好我们下一步。那下一步之后我这个配置文件是不是加载完毕的嘛? sporting 这个容器是不是创建完毕的嘛?创建完毕之后我点开它,它内部维护一个属性,是不就别 factory? 我们之前是别看过点进去,我们之前经常看谁呢?我们经常是不看。这个叫 singleton objects, 是不是?看它 是吧 power, 它之外,你看它内部还维护了一个,叫什么呀?叫 bin d n d 是 map, 首先你看它是不是叫 carry 的哈西, map 是个 map 吧,然后你点进去,点进去你发现它是不是有个 user service 跟 user d o 对吧?我还是说啊,这个 user service 跟这个 user d o, 它是那个 user d o 跟 user servic 对象本身吗? 不是,你再点开看它对应的是什么?你看这个 user service 对应的这个值是什么值?并不是 user service 对象本身,它对应的是 generic bean definition, 就是它是个 bean definition, 明白吧?它封装是一个并标签的信息,而我这个 urdo 呢?究竟是不是也是一个 indiffnation? 哎,风筝也是那些变的信息,能明白吧?所以它内部存的不是对象, 那对象在哪存着呢?在 singleton optics 存着。所以说这个 indiffection map 是先有的,就把它细细收集到这,然后呢,再对它进行循环,再去创建对象,把每个创建好的对象再存置到 go to object 当中,你发现这个 single time object 是不是存在很多对象吧?哎,我们找我们认识的是不是 user service, 你发现他是不是就说对象本身呐?因为这是创造好的对象嘛,对不对?哎, user d o 是不是也是对象本身? 能明白不? ok 吧?哎,所以说我们要知道,在这个地方,这个 b factory 内部维护了一个,哎, single 团 object 也维护了一个,叫什么 been differentiate 是 map, 那这个 been different 是 map, 然后维护的哪些信息呢?比如说我们看这个 you are service 啊, 它是不是一个 bndp 的卖法,是吧?它维护哪些信息啊?点进去你发现有这么多信息啊,太多是吧,其中有一个 我们很熟悉,是吧?就是它叫 being class, 这什么意思啊?是不是当前 user service 的权限定名啊?这能明白吧? ok 啊。 其实讲到这呢,我们就大概清楚这个过程了,回到我们的 pp 当中啊,我们下一页,我们再看下什么呢?再看一下这个标签对应的这个 indifficient map, 它内部到底维护哪些信息?刚才我们通过打断点其实已经看到了它内部是维护这么多信息,是吧?哎,我们去看一下这个 indifficient map 到底内部维护着哪些? 细细好,我们看着啊,我们结合什么?结合这个并标签去看,我们知道并标签内部是不很多属性, 全线的名,别名 a z e t 是否延迟加载 scope 作用范围引进白色出入化方法 disri 消费方法 factory bin 啊,这,这个对, factory bin 是吧?哎, factory method 这个这个这个,这个工厂方法是不?工厂币是谁是吧? okay a parent 他爹是谁?等等等等,还有什么呢? her properties, 这什么意思啊?就是代表当前这个并有哪些属性,对不对?好,那下边我们就看一下 shift shift 啊,我们就搜一下叫宾 definition, 这边 demination 就它 对吧?它这个接口,那说明下边是不是很多实线对不对? ok, 你往下走啊,啊,首先我定义你是 singleton 的还是 protop 的是吧?给个常亮啊? ok, 往下走, 呃嘶呃,这个,这个还不太好看呢,是吧?我就看,我看 ppt 吧,看 ppt 吧, ok, 它有什么呢?咱看一下这是什么? 是不?当前我这个啊,并的那个权限的名,并的作用范围,并是否延迟加载并的,然后这个 这个,这个 factory bin 是谁,是吧?这个 bin 的这个 factory method 是谁,是吧?这个 unit method 是谁?等等,你看是不是都有设置方法,是不都 set 方法啊? ok, 只归这个,当然你通过这个 还说我那个 debug 模式你也能把它看到?你看啊,比如说我现在看的是谁呢?我现在看的是不是这个 youtube service 是吧,它就很值是不? youtube service 是 gap, 没指定没指定吧, 你说没指定不? single 他们不是单的吗?是现在他这个 indignation 啊,他封装是你原生的这个并标签,你并标签在这,是不是就没指定 service? 没指定他这就空的就没有值,对吧?他在解析时才发现,你要没有值没有值,我就选用默认的就 single, 他明白吧。啊?是不是 biz 已腻?他 force 不延迟吗?是吧? ok, 还有什么呢?认识的找你认识的啊。嗯,我们找这么一个认识的吧,你找到那个叫往下走,他有一个叫 prop。 哪呢? properties? properties 还没找着呢啊,这呢,你看是不是有个叫 property values 是吧? property values 你点开, 现在有吗?那空的没有。为什么没有啊?因为我在配置的时候我这个 service 没没有注 do 对不对?那这样啊,我按那种方式把它注进去, properties 又在 d o r e f 又在 d o。 行吧,那现在你再去执行,好,断点又跑这是吧。好,下一步。好,我们再去看。 找到 be factory, 找到内部的 been definition map 是吧?点进去找到我们的 user service 啊,再点进去 讲这个值是吧?他这个 indiffnation 你再找啊,刚才我们叫 proptis。 哎呦,这个字太小,眼看着可费劲。嗯,在这呢是吧?刚才是没有,因为刚才我标签是没配置。那猪肉,现在你发现是不?赛子是不是有值的吧?刚才这个就是零,没有值,现在是不是有一折, 你看是谁,看是谁,是不是 you 的理由啊,所以你会发现你在这个 indefinite 是 map, 它是干嘛的呢?它主要就是对你当前配置的这个并 信息进行封装的, ok 吧? ok 啊,行吧。这是关于我们这个这个这个这个这个这个就是说这个 individation 在这儿啊, being definition 到底是什么?我就给大家讲明白了,后边再讲。讲什么呢?后边就是再讲 他是不怎么把这戏拿出去呢,是吧?是不怎么封装的对象啊?是这意思吧? ok 啊。

好,那我们继续啊,刚才呢,我们通过打断点发现断点,这呢是吧?通过打断点发现我们当前这个 bffection 内部 是不是维护着什么呀?是不是维护了一个 indifference map 跟一个 singletop obligs 是吧?那我们再从原码的角度看一下啊,他在哪是吧?当前我这个 bifetry 是谁啊?是 default listable bifectory 是不是它吧。好,我们就看一下它, 哎,在这把它拽一点。呃,断点关掉吧。 shift shift d f default listful, 是不是第一个吧? defectory。 好,我们把它拽到最上面。这个 default listful defectory 啊,它内部其实已经维护了很多,是不属性的吧,哎,你发是不是这么多,你看这个, 哎,这个,这谁,是不就是那个 bean d p 健身麦吧,对吧?健身是,是那个 be 的内幕。什么自助串儿吗?指是谁?是不是就是那个 bean d f 健身对象 对吧?那你再找找谁找那个当地时叫 single tao objx 是吧,你发现没有?你这看开顿没有? 没有,你可以搜一下啊,不是 shift shift control f 对不对?在当前页搜叫 single single turn objects 吧,你看没有 objects 是没有 s, n, g, l, e 啊,写错了是吧? single turn objects, 没有啊,没有 没有。那怎么维护的呢?啊?是不是找爹啊?找爹,找爹,找爹,爹,有吗?再搜 ctrif, 爹也没有,是不?爹也没有。嗯,爹没有。找谁是不找爷爷,找爷爷。 ctrif 爷爷有吗?爷爷没有,还爷爷没有?没,没有,接着找吧,找什么?祖宗 是不也没有?好,接着到那找。哎呦,这第几班呢?第五班呢吧,找没找,哎,掉了哪呢?这呢,是吧,是不是他 是吧?叫 singleton obj 四 map 集合,并且在这已经给你创建好了啊,初始化多少?二百五给我 是吧?初始装二百五六个,你不要担心他装,你不要担心装满呢,因为后期自动还会扩容呢,是吧? ok, 你发现刨除这个 single opt x, 它是不是还有什么这么的什么 erange, 什么 singleton objects, erangei, 发现中是不是叫早期的?早期的是不是当 kiss 啊?这个后期我们在讲的时候,我们后期也会讲到啊,讲到那个病的,然后学学会引用的时候啊, 好,通过这个代码啊,我们也会发现这个 bifection 啊,内部是不维护着两个集合,一个是存什么,并定义一个存什么。最终的那个对象啊,最终那个当地对象啊,会进行存储, ok, 啊,这是关于我们这个东西啊。 呃,我往下翻我们的 ppt, 这个已经讲过了啊,先讲过了,原码已经看到了,是吧?基本的流程啊,就这样的,最后呢?然后有一个基本的流程啊,我们稍微总结一下,是吧, 那并在创建时,对于我目前而言,我们知道基本有哪项流程呢?大概这五步吧。第一步,加载插苗,配置文件啊,解析每个 冰标签,然后把每个冰标签冰标签的信息去封装成一个,对应的时候,冰跌冰冰对象,对不对? ok, 那再将这个冰冰冰冰对象呢,存储到那个冰工厂那一步的一个卖部当中 啊,并发出内部是维护了一个 map, 这个 map 叫并 divid, 是 map 是吧?哎,存进去,然后呢?这个这个什么容器呢?它底层就对这个 be map, 然后进行 billi 啊,取出每一个 bcc 干什么呀?创建边具项,把创建好的边具项就到第四步了,哎,存储到这个边 factory 内部,是不还维护了一个卖法, 这个当地词对不对?我们把叫当地词 single up 这个词,是吧?存到这个内部,那你在进行这个使用,这个并就是这个死病容器,在 get b 时,根据名字其实就是从这个当地词当中,干什么呀?去匹配对应的并并返回, 这过程要记住啊,基本步骤,对于我们目前来记住步骤是吧?这个过程的步骤是两个吧,第一个就放入边界边边上,存到脉搏当中是吧?然后呢,再取出这个信息,然后反射穿的巨像,再封到一个脉搏当中,这个脉搏叫 singleton objex 啊,就这个意思。好,下边有张图,我们看这张图 啊,其实这个图就是对刚才那个文字,那个过程的一个描述啊,首先呢,我们有个配置文件是吧?这个配置配置文件呢,我们使用个 reader 去读,对吧?读完之后呢,是不是把这个内部的 c c 方程一边 dimination 啊?放入这个,这个 indeedmere 存到一个 indeedmere 卖部当中,然后呢?呃,这个这个兵工厂,然后内部会对这个 mebel 进行一个循环,取出每个 indeedmere 信息,然后呢,反射串串对象,把串串好的对象再放到一个 single tele object, 一个 meb 当中, 然后最终呢,你 get 是不是就从这个内部上去找啊?就这个过程,这张图核心的部分,这块给我记住啊,这块记住,为什么记住呢?因为我后边讲的就我在,就是本章后边讲的东西都是在这张图上进行不断的增加, 我们写我们一会下个,下下个那个讲什么呀?是不讲这个 binthole 处理器,是吧?也会在这张图上然后进行增加,所以这是一个最基本的一个图形, ok 吧?好,到这我们就把这个病的使用的话一个基本的流程给大家讲清楚的啊,大家一定要把它记住。


我叫 spring, 是一个万千程序员大哥,每天都在手心把玩的小宝贝儿,哈哈哈。今天为大家介绍五 x 版本的我体内最核心的运行原理之一 lc 中病的生命周期。 后续将基于此一步一步拆解我的身体,为大家做更多的原理性介绍,帮大家在面试和走向架构岗位做一点点贡献。 首先,我程序员大哥们在我身体上编写的各种病是我体内最为核心的东西。我诞生的主要目的就是帮助各位大哥妥善管理和使用这些病, 并在我体内会经历三个大的阶段,就是产生、使用、销毁。其中已产生阶段最为复杂。 在程序员大哥命令我启动的那一刻开始,我体内的生产线就开始准备生产一个个的病了。启动过程很复杂,下一个视频会为大家详细介绍。 在我启动之初,为了精准的了解大哥们对于病的要求,我会通过加载病定义、 local definitions 方法,用 x、 三百、哦、柱姐、扫描等各种方式,将大哥们在我体内定义的病类一个个都找到,并且放在我体内容器中的一个病病疫 集合中。集兵大、分离、身慢。有了这些并定义集合之后,我就可以便利这个集合。然后通过我体内的 qaq 方法为大哥们创建一个个 bean 对象啦。创建 bean 大体分为构造对象、填充属性、初始化、实力注册、销毁四个步骤。 首先构造对象。我体内通过 craig instance 方法进行对象的构造。先用反射机制从并定义中的 bing class 拿到这个类的构造方法。 当然啦,我在拿取构造方法时是有一些规则的,如果这个病只有一个构造方法,那毫无疑问我只能拿它啦。无论这个构造方法有没有入餐。 当病中有多个构造方法时,我会先拿带有奥特瓦尔柱姐的构造方法。当然,如果多个构造方法都加了奥特瓦尔柱姐,我没有办法判断大哥到底想让我用哪个方法进行构造,所以我只能报错了。 如果构造方法都没有包头瓦尔柱姐,我就会优先拿无入餐的方法。如果多个构造方法都是有入餐的,我也没办法判断 具体拿哪个,所以又要报错了。在这里,我非常不建议大哥们在任何病中添加多个构造方法,这样可读性低,理解和维护会很困难。 在我们选择了确定的构造方法之后,就要准备这个构造方法需要的参数了。我会在体内的单历池中根据参数的 class 类进行查找。 如果这个类在我体内有多个实力,则会根据参数名在进行匹配。如果没有找到,我就会认为构造信息导致不完整而直接爆错。 在参数准备好之后,通过反射就可以进行并的构造啦,也就是我们常说的实力话。当然,如果选择的是无参构造方法,则无需参数直接构造。其次,填充属性。在并对象 塑造成功后,接下来就进行属性填充了。我通过 popli b 方法为 b 内部的所需的属性进行复制填充,通常就是奥特瓦尔柱姐的这些变量。 我体内会通过三级缓存机制进行填充,也就是我们所谓的依赖注入三级缓存。后续会详细介绍, 然后初始化实力在属性填充后,紧接着就要通过 renecesden 方法对这个实力进行初始化了。 初始化的第一步是初始化容器相关信息。通过 inmoke one message 方法为实现了各种 over 接口的 bean 设置诸如 beanness、 bean factory 等容器信息。这里要注意的是,我体内的 ova 的接口代表信息感知接口,一旦实现了这些接口,就可以在并实力中 感知并获取到对应的信息,真的非常方便。接下来就需要通过 emoke nick methods 方法执行 bin 的初始化方法啦。这个初始化方法是各位大哥通过实现 initializing bean 接口而实现的 after property set 方法。 方法明很直接,表示 bin 填充属性后执行。在 after properties set 执行后,还会继续执行各位大哥在 bin 上自定义的 enigmath 方法。 在执行初始化方法之前和之后,还需要对并后置处理器 in post processors 进行处理。 我通过 applying post processors, before initialization, apply being post processors, after initialization 分别在初始化之前和之后处理各种病的后治处理器。这些处理器包括我自身提供的 负责 aop 处理的 annotation aware aspect geotoproxy creator, 负责构造后 post construct 和销毁前 predestrial 处理的 iniquistural annotation bean、 post processor 等系统级处理器, 以及各位大哥通过实现 post processor 接口的自定义处理器。当然,这些处理器有很多,可以通过实现 priority order 接口来指定顺序进行逐一处理,最后注册销毁。 其实上面步骤完成时,并实力就已经可用了。为了让并优雅地销毁,我通过注册销毁 register both bowl bean 方法将实现了销毁借口和 boss bowl bean 的 bee 进行注册。这样在销毁时就可以执行 district 方法了。通过以上四小步,我们就将并 创建好啦。最后只需要将这些完整的 bin 对象通过 xc goten 方法放入单立池 cincote objects 中,就可以被获取和使用啦。这样产生病就全部完成啦。接下来,程序员大哥们就可以任意的在我体内使用这些病啦。 最后,当我执行 close 关闭睡觉的时候可产生 bean。 类似在销毁之前,要先执行销毁前处理器 post process before destruction, 这里就会执行并中 predispro 柱姐的方法。 然后通过 destroy bins 方法逐一销毁我体内所有的病。销毁时会执行刚提到的 destroy 方法。在 destroy 执行之后,也会通过客户销毁方法 inmalk custom destroy method 来执行各位大哥在并上自定义的 destroy 买粉方法。这样从病的生产使用到销毁,这一套完整的生命周期就介绍完了。如果你喜欢这期视频的话,请一定记得长按点赞按钮,求各位大哥一个三连鼓励,给我一些信心,坚持制作下去!

说说 being 自动装配方式有哪些?自动装配默认的方式主要有五种,一 no 二、按名称白脸三、按例行白 type 四、按规则器方法例行注入 construct 五、 default 默认。 今天我主要是讲一下白太白跟白内蒙的这个实际用法。白内蒙对于我们的 anuberys, 就说我们在某个病的需要被依赖的时候,我们就根据这个病的属性,然后从病病跟上去查找,然后完成注入白太白的话,就是根据这个被依赖类的类名称, 然后根据内民生去查找,从并工并工厂里去查找。查找出之后呢,如果当前,如果这个当前这个类是个接口,且他的实现了有多个,那样的话就会出现问题,这样的话他会圆码中会默认从 他的名称属性名称,然后去依次查找,如果查到的话就返回给他,如果查不到的话就会报错。好的,以上就是我的回答。

好了,是不是以实力化并有几种方式?那这道面试题呢,我相信大家应该在脑子里面能想到个一两种,对吧?其实他肯定不不止一两种啊,来我们来说一下。 首先呢,第一种是通过构造函数的方式,也就是死不定底层啊,当我们通过 x 脉偶也好,还是通过注解的方式也好,比如说我们通过 s 脉偶去配置了一个病,比如说 配置了一个优势,或者说我们通过注解的方式配置了一个恐怖的他,那么这个时候呢, supreme 他的底层,他呢就会通过反射的方式,他会把这个 plus 啊,把这个完整内路径啊,给我们存在并的一分呢,省的 bing clus 属性当中去。那么 supreme 在创建 bing 的时候呢,他就会根据这个 bing clus 啊进行反射, 通过反射来拿到我们的一个实力,当然反射呢,实际上是调用这个类的一个钩子函数,从而得到这个实力,这是第一种方式,那第二种方式呢,就是通过静态工厂的方式, 大工厂我不知道同学们用过没有啊,也就是说呢,我们在刚学习 supreme 的时候呢,大家应该都学过,对吧? 那么静态工工厂的方式呢,又是给当前这个病呢,配置一个 face mate, 那么 siri, 他在实力化的时候, 就会帮我们去调用当前配置的这个病的 fx 的所指定的这个方法, 从而呢来帮我们进行实力化,就比如说我们这里指定了一个 ctruss fx, 对不对?那么我们在这里呢,就可以返回一个对应的一个对象了, ok, 这是静态工厂的方式。 那么还有一种呢,是实力工厂,当然这个静态工厂呢,他 必须要保证你指定的这个方法呢,是静态的,对吧?要不然怎么叫做静态工厂呢?还一种呢是实力工厂,那么实力工厂呢,就是需要你在这个 face max 的基础上呢,再去指定一个 fx 并,那么他在实力化的时候是不是里层,再到就是再到实力化这一步的时候,他就会帮我们去调你指定的这个并的这个方法, 能明白这是实力工厂,通过 fx 并以及呢加 fxx 的来进行实现。那么其实 其实我们的艾特病啊,我们的艾特病注解呢,他的底层其实就是利用的这种方式来的,因为不管是 fx 的病还是 faker 的,他们最终呢其实都会将对应的这些定义的信息录取到哪啊? 读取到病的分离审当中,我们之前都说了,病的这些定义信息他都会读到病的分离审当中,我们可以看一下,都有对应的属性用来存储啊, 底盘内饰我们可以看一下,里面呢, 我们就能找到对应的,嗯,看一下 faker bmam 对吧? face to 瑞 mase 的这个呢,就是用来存储我们刚刚看到的设置的这些属性的值的。 当然如果你不是采用的 x mao, 你采用的是这种抓孔废的方式给他配置一个艾特并呢,他其实就会把 把这个 a 的并所在的这个配置类呢,给他读取到这个 fact b 的内幕当中去,然后 fx 的 mates 的内幕呢,就是你通过矮的并修饰的那个方法名字。好吧, 所以说艾特病他其实也是实力工厂的这种方式 ok, 跟我们以前用 x mao facebook 加 fact max 的其实是一种,我们就了解一下就行了。好吧,这是属于我给你们的拓展的一个知识点了。 那么第四种呢,是通过 facb 的方式,那么这个 facebook 的方式呢?我相信很多同学应该是没有听说过,对吧?那个病呢,就是你需要在某一个病的基础上,随便给他们演示一下, 好吧,比如说在这个病的基础上,我给他呢实现一个接口, 怎么没有提示了呢? 稍等一下,我这个 id 可能出问题了,我换一个吧,我换在在这个基础上, 就比如说,就比如说这个卡,我现在呢奔跑,哎,算了算了,我重启一下吧, 我这个 id 出了点问题,我重启一下,继续。刚刚说到 face 病,对吧?那么 face 病呢,就是在我们的病的基础上呢,去给他实现一个, 有了,我说怎么重启都没用呢,实现一个 faker 冰, 然后呢,我们需要重写一个方法,叫做 gat, 我不觉得,那么这个 gay 的,我不觉得呢,他需要返回一个我不觉得类型, 那么这个 oppo 键的类型就可以随意的返回任意类型,比如说我们当前这个病,他是个 car, 对不对?但是呢,你可以返回一个 timk, 这个太可呢是我另外的一个对象,那么我可以在这里呢,又一个太可,那么这里这个 oppo 这个泰文呢,我们可以直接返回这个太可的克拉斯,他的累。这样的话,我们 通过这个卡的名字将不再是获得这个卡他的一个实力了,而是呢,获得 这个该的奥布这个的返回的这个对象。好吧,那么这种是 faker 病,第四种石绿化病的一种方式, 后续呢,也会有其他的面试题呢?去讲这个 facebook, 那么我们可以看到这四种啊,同学们,你们觉得第一种跟另外三种最大的一个区别是什么? 第一种呢,是由 supreme 帮我们去控制他的一个实力,对不对?那么另外二三四呢,都是可以由我们程序员 自己去控制他的一个实力化的过程,所以说这另外这二三四这几种方式他更灵活。好吧,这是我们实力化病的几种方式。

spring boot 中 at 并的工作原理是怎样子的?首先我们都知道 at 并它其实就是去定义了一个并嘛,那么我们是写在方法上面的需要,那么呃我们它怎么工作的呢?其实就是 spin 容器它在启动的时候,它会来解析我们的这个配置类, 而解析配置类其实就会去解析我这个类上面的注解。假设你这里还加了什么 component 是干注解啊,或者说引魄的注解啊,那么都会把它解析出来, 那么解析完内上面的注解之后,他就会去解析内里面的注解。我们都知道内里面其实就是方法嘛,所以他就会去解析你内里面的这些方法上面的注解。 而当他如果说解析到一个方法上面有艾特病注解,那么他就知道了你这里定义了一个病这个病的名字呢?其实默认就是你这个方法的名字,当然你可以通 v at 病额外的可以去指定它的名字,但是默认就是方法的名字,那么这个病的类型就是你这个方法返回的类型, 返回的类型。然后还有一个点就是我们可以在这个方法上面你又又可以去加很多的注解,比如说 leg 注解,你可以去让这个病呃去定义他是难加载的还是非难加载的,呃,然后包括这个是过不住是过不住解,你可以去定义当前这个病他是单例的还是多例的。 所以说 spring 容器它到时候解析这个方法的时候,它可能不光光只是解析艾特病注解,还会解析一些其他的注解,最终就生成出来了整个病的定义,你这个病的名字,你这个病的类型,你病的 作用欲,你病是不是哪家宰的?这其实都是属于病的定义,包括你艾特病里面还可以去指定一些初始化的方法,包括销毁的方法,都可以去 去通过这个注解据指定有,这都是属于病的定义。而这些病的定义就会对应一个病例非类型的对象啊,那么这个对象就会存在我们的死病容器里面,当死病容器他得到了所有的病例分类型对象之后,那么死病他就会去判断说, 呃,这些并列分类型对象里面有哪些是非朗加载的单例啊?把这个类型的把它给找出来,找出来之后啊, spring 融进来,在启动的时候就会把这些类型的并对象把它给创建出来 啊。当然了,其他类型的,比如说多利病,或者说难加载的当地病,那么这些病他会在你真正去使用这个病的时候,才会真正的去把病对象把它给创建出来 啊。所以说这是关于我们 at 并啊大概的一个工作原理。

spring 致懒加载的病好,那我们再继续看。我们刚刚其实讲了其实一个病的定义,它除开有病的类型之外,其实还有一些属性。比如说像这个 lazy in need, 这什么意思呢?它其实默认是等于 force 的,所以如果说我们把它改成 to, 那就表示它是什么什么啊?类似于懒初始化,就是可以把它翻译成为懒加载。好。啥意思啊?我们知道最终 spring 它其实是需要帮我们去根据这个类型去创建一个对象的。 那么默认情况下面它是什么时候创建的呢?就这个 you 的设备准备像它在什么时候创建的呢?啊?我如果不讲很多东西,可能会以为是在呃就 get 病的时候去创建的。哎,不对啊。其实像怎么我我我怎么来验证这个问题呢?我们来这样子,比如说 我在这边去呃,提供把把那个无偿的购置方法,把它给写出来来,我写一个无偿的购置方法,然后在这边随便去呃,打印一点什么东西对不对?打印一个零吧,然后这里打断点好,我们来 debug。 我们来看一下 好,第八个。这边先不管了,我们直接进来。好,注意看哦。我现在相当于在创建我们 user 位置的对象对吧?那么他从哪一行代码进来的?他就是从二十二行代码,也就是十倍容器启动的时候, 他就会来创建我们 user 设备时的对象。所以这就是我们说的非览加载的意思。就是他不是呃,真正用想要去用 use 设备的对象的时候才去创建啊。对,如果说你是真正想要用 use 设备对象的时候采 去创建,这个叫做难加载,而默认他就是非难加载的。所以他会在容器启动的时候,就会把 usb 设备的对象把它创建出来,然后放到容器里面,你后面再来用,就直接拿拿着用就可以了,不用再去创建了,懂吧?所以说是这个。所以你看啊,假设我把它改成 q, 我们同样的再来 debug, 你看他会在什么时候去创建呢?这怎么还来着?你再跑一下,好,又进来了。哪一行代码进来的呢?来第二十四行代码。哎,这种人说的懒,家长只能去 get bian 的时候,他才会去创建我们 youtube service 的对象, 懂吧?这里就呃不一样啊,这就是逻辑。当然了,像这种呃懒加载,我们这是这种方式,可以去定义一个病,他是不是懒加载。我们呃,像艾特病也好,包括像 朋友们的注解也好,其实都可以。比如说默认情况下面 user service, 它就是一个难加载的呃,一个非难加载的。但是如果说我们加了 lazy 注解,那么它就是一个难加载的啊,就跟刚刚的意思其实是一样的。还包括如果说你是用艾特病也是这样的,因为我们 lazy 注解, 它其实也是可以写在呃我们的那个方法上面的。比如说这里一个 b, 它是非蓝加载的,你如果加上 lazy 注解,它就是难加载的一回事。好吧,所以我这里就不去 啊,演示了啊,就不去演示了啊。当然,呃,还有一个点,我们说的这种难加载和非难加载,其实只针对我们的答案逆病。这个要注意啊。 大力病。所以我默认情况下面我们的病其实也都是大力病。所以你嗯我们除开大力病之外,其实还有什么 啊?玻璃病,比如说 prototep, 我默认情况下面相当于就是一个 single 啊。如果说你配置成这个样子,那么相当于这个病,它就是一个玻璃病。同样的, component 的注解这边也是这样的啊,你如果加上这个注解,那么 use service 它其实也就是一个 多立病。而多立病的话,就无所谓懒家宅和非懒家宅。因为多立病,它其实就是每一次 get 病的时候都需要来创建好。所以这边我们也可以针对单立病和多立病来进行演示。

好吧,那介绍完基于扎苗死不人应用啊这些东西之后呢,那我们就一个一个去学习,首先呢,我们先学习死不人并的一些基本的配置啊,也是一些比较基础的东西,那我们来看一下, 首先呢, spring 在开发当中啊,主要就是对我们的并进行配置啊,主要就是刚才我们在我们的这个, 呃,配置文件当中对于那个并标签的配置是吧?那这个主要配置有如下这么多,我们稍微过一遍啊,每个都会详解。第一个呢,然后主要是配这个就是并的权限的名啊,这个我们已经配过了,然后给他指定一个 id 名称,这个 id 的名称是在配置文件当中这个并的一个唯一标识。 那这个 id 呢?后期会转换成并,在容器当中一个并内幕啊,并内幕,这能能跟上吗?并的名称明白吧?就这个地方配的是 id, 但最终他到容器当中会转化成一个并的内幕,而我们盖的并时,其实通过什么获取的,哎,我们在之前用到的盖的并那个块的那个参数,其实不是 id 啊,他其实是并内, 明白吧?哎,是并的名称,只不过配的 id 后期会转成容器当中的并内啊,这个大家知道,下面呢就是配这个, 第二个呢,就是配病的别名,哎,你发现这个有内幕是吧?就是拍电台配内幕吗?就是说一个病可有多个名称 啊,就像你一样把你叫张三是吧?你是不是小名是不?狗子猫子是吧?这都叫小名是吧?这个内幕主要是配什么?主要是配这个并的小名的,也就是别名的啊,配别名的。 呃,所以说我们在盖的壁纸呢,我们其实不仅可以根据这个 id 啊,这个 id 是获取的,那后期然后配这个内 内幕呢?他这个也可以获取照,就是我可以根据 b 内幕获取照,也根据别名获取照啊,我们就是一起演示啊,下边是 scope, scope 什么叫范围啊?就并一个作用范围。那什么叫并的作用范围呢?其实在这我们讲的直白一点就是并呢,在末日情况下,它其实就存在于一个,就是当地的 就死兵容器啊,帮我产生一个并对象,比如说我们的 siris 对象是吧?这 siri 对象有几个?就一个啊,就一个放到那个麦访,放到容器当中是吧?你在获取的时候就把一个给你是吧?但是有的时候呢,你可以然后修改次告访啊,让这个死兵容器帮你。在产生这个病的时候可以产生多个, 那多个他就没法去存在这个容器当中的,是吧?就是你每次在盖地被时,他都会创一个新的,然后返回给你,因为你说多。有的时候为什么多个就不能存容器呢?因为多个你到底有多少个呀?多个多少个?三个是比较多, 五个叫多个,一百个是比较多个。那死不认也不知道到底要几个啊?不可能一开始咱也搞一百个存容器存着吧。那也不行啊,那性能有问题啊,对吧?一会我们再讲 sgo 吧,就是他一个作用范围啊,再往下走, vc 以内。这什么呀? vc 你想 什么?延迟加载啊?延迟加载,我们刚才已经给大家对比过呢,我们的四部容器就是 omgpa 成 comtax, 他末的情况下配置文件一加载对吧?容器一创建,我这个币是不是就都啪啪啪都给你创建好是不是放到一个位置是吧,等待你去该你去获取对不对? 哎。缓存提前给你缓存好,但如果某些病啊你在配置时你配置能给自己内在哪一处?那衣服是干什么?我不需要你马上帮我去加载配置文件的时候就把这个病给我创建好。那什么时候帮我创建呢?就跟那个病犯 水冰工厂一样,我什么时候盖的被式你什么时候再帮我创建啊。延迟加载好再往下走 intimates 的这个地方。 intimates 的初始化方法 啊。出水化方法就是当你这个病在创建完毕之后啊。哎,可能你可以要执行一些出水化的操作,我就可以在这个地方通过配置的方式指定这个病内部哪个方法可以作为出水化方法。那这样的话当病疗创建完毕之后他就会帮你就死不认啊,会自动帮你去调用出水化方法。 有人说我们不是有那个构造方法吗?构造方法是构造对象用的触手法方法是等对象创建完毕之后再帮你调用的触手法方法。他是有个时间差的啊。再往下走第四代没事的,销毁方法 就这个病在挂值前。哎,我是不是可以然后执行某些方法是吧,这个用处不是特别大啊。再往下子 啊。熬出来。这什么意思?熬出来代表然后自动注入啊。自动注入,哎又是注入呢是吧。我们之前注入是配置吧 啊。我们应该注入是可以配置通过盘把铁丝吧,通过赛的方法,在我们的代码当中赛的方法,哎,可以注入,那如果,然后你不配置情况下,我能不能从容器当中自动去来找到哎,你想要的这个东西帮你扔进去的。 哎,也可以啊,我们可以设置自动啊注入的方式,奥特贝尔啊,可以 by type 啊,也可以 by name, 就是通过类型,如果你配置完毕之后呢,那这个并,然后内部,比如说,哎,他这个有这个对应的 set 方法是吧? 啊,他会自动的,然后从容器当中找类型匹配的或名字匹配的这个并自动给你扔进去,你就不用每次在学然后 purpletes 啊,人为去写 purpletts 进行 输入呢啊, ok, 那再往后走呢? be factory 啊,呃,跟这个不是 factoryback factory messer 的,这个涉及的是并的,然后这个创建方式,这个我们一会再给大家讲这个地方,然后一句话半句话我们说不明白啊。 行吧,这是关于我们这个并标签,其实涉及的主要的配置在这基本哦,都在说全的啊,当然还有一些可能不是特别经常用的基本,然后你一辈子见不着一次的啊,在这我就没有涉及啊,就非常少呢,这个地方已经非常全的啊。