00:00
好,那下面咱们来研究一下这个不同的作用域对咱们的生命周期的一个影响,好,就比如说我们现在咱们这样去做,大家看好,我们把咱们下面的这三个步骤呢,都给它干掉啊,也就是我们在这获取B,咱们输出B,然后下面咱们是不是来关闭容器,我们在这咱们只留一句话,就是来获取我们当前的IOC容器,大家注意,我们现在来一个执行,大家会发现,哎。这个时候啊。咱们当前生命周期的三个方法,前三个步骤它是不是直接就执行了。大家看一下,第一个叫实例化,第二个叫依赖植入,第三个叫初始化,那换一句话来说,然后我们当前生命周期的前三个步骤是我们在获取IOC容器的时候,它就执行的,是不是我们在获取bin的时候来执行的,并不是,为啥呀,因为我们当前IOC容器中配置的病,它默认是什么,默认作用率是什么,是单例,那也就是说我们当前通过IOC容器来获取这个病的时候,咱们获取的永远都是唯一的一个对象,那所以说大家想想,我们有没有必要在获取它的时候创建,没有必要咱们直接在获取IOC容器的时候就把这个对象给创建好,那我们以后用的是不是就直接都是这同一个了,OK吧,行,下面大家再看,然后如果我在这把这个scope,咱们给它设置为pro type,大家注意,然后我们现在再来一个执行。
01:33
好,大家看,哎,这个时候有没有输出呀,没有输出,那也就是说当我们把这个B的作用域设置为多利的时候,因为每一次咱们通过并获取的对象都是一个新的对象,那大家说它有没有必要在IOC容器获取的时候就直接把咱们对象创建好啊,没有必要,因为每一次你获取它都是一个新的对象,知道吧?好,那下面呢,我们把这三句话把它的注释取消掉,然后我们再看一下,那大家想,那它既然不是在获取IOC容器的时候就执行的,那肯定就是我们在获取对象的时候执行的,对不对?好,下面咱们来一个执行,大家看啊。
02:13
来大家看一下是不是应,那我们刚才咱们做过测试,当我把它的声作用域设置为多力的时候,在获取IOC容器的时候,咱们的前三个步骤并不会执行。然后呢,所以说我们当前的B的作用域如果是多力,那我们当前的这前三个步骤是不是应该就是在咱们获取B的时候来执行的,OK吧,这个其实很好理解。因为每一次咱们设置为多利之后,你每一次通过这个并来获取的对象,它都是一个新的对象,所以没有必要提前创建。好,但是大家也能发现一个问题,当我的容器关闭的时候,咱们的销毁的方法执行了吗?没有执行,所以说当我们把咱们的B的作用域设置为多力的时候,它的销毁的方法现在就不由我们的IOC容器来管理了,OK吧,行,这个大家了解一下就行啊好,那我们在这咱们来写一个大家需要注意的问题,哎,注意需要注意什么呢?然后若啊若这个病。
03:18
好,然后若病的作用于,然后为单历史啊,为单历史好然后咱们生命周期的前三个步骤,前三个步骤对吧?然后会在什么时候执行,大家说获取IOC,获取咱们的IOC容器时,然后来执行,OK,好,那若B的作用欲为什么为多历史生命周期的前三个步骤会在什么时候执行,咱们获取B的时候来执行,哎,这个大家要看好啊,所以说B的作用欲不同,它对我们当前的生命周期也是有一定的影响的啊好,那下面的呢,我们再来说一个问题,大家注意,你看我们在咱们的这个笔记里面啊,大家看到我们所列出来的这个生命周期好像很多,对吧?好,然后这里面多了哪几个步骤呢?大家看B的对象的创建,就是实例化,咱们已经看到了,然后呢,对给B的对。
04:19
像设置属性依赖注入咱们也能看到,然后呢,在这多了一个叫B对象初始化之前的操作,然后在这是对象的初始化,初始化咱们能看到,但是这个操作和它后边的这个叫并对象初始化之后的操作,这两个咱们应该是没有见过的吧,对不对。对吧,然后因为我们只看到了初始化,然后还有就是咱们初始化完之后大家就可以用了,然后再往下呢,就是销毁,最后呢就是IOC容器关闭好,那这两个操作从哪来呢?大家注意,在咱们的spring中,它为我们提供了一个东西叫做B的后置处理器。叫做bin的后置处理器,然后这个东西呢,它可以干什么?在我们当前生命周期中,咱们初始化前后再加上两个外的操作,好在这咱们有对吧,叫做B的后置处理器,大家看啊,会在生命周期的初始化前后添加额外的操作需要,那我们当前的这个后置处理器咱们怎么来创建呢?那来咱们来验证一下,给大家测试一下啊,好,然后咱们首先我们需要来创建一个类,然后这个类我们需要让他去实现我们的一个接口叫并post的process,然后这个接口来。
05:38
下面大家看啊,然后我们在这咱们再创建一个包,然后比如说这个包咱们叫叫做process,然后下面咱们的类呢,然后比如说我们就叫做I my being post process,然后呢,咱们需要让它去实现我们刚才的这个接口,对不对,好,OK,好,然后这个接口里面它一共有两个抽象方法,但是在这它并没有给我们报错,那这说明什么?大家想想,那这是不是就说明我们这个接口里面的这两个抽象方法,它应该是有一个默认的方法体,或者说用static静态修饰了,对不对?好,咱们把它给打开,大家看一下啊,看默认的方法体,然后这个是不是也是默认的方法体啊,好,那所以我们如果要想重写的话,大家也可以来重写,比如说怎么做CTRL加O,然后来找到咱们这里面的两个方法,点击OK就行,大家注意,你看这个方法是干啥。
06:38
好的呀,啊按这个方法。然后它的名字叫什么?它叫做post process before initialization,那不就是在我们当前生命周期的初始化之前来执行的嘛,对不对,好,然后此方法,哎,此方法,然后在咱们B的生命周期初始化之前,然后来执行好,然后下面咱们再来看,那在这是不是还有一个方法叫什么,叫做after initialization,所以说这个方法是在咱们B的生命周期初始化之后来执行。
07:17
好啊,行,那比如说咱们在这儿咱们怎么办啊,大家看好这个方法的返回值呀,是object的,然后它可以对我们当前创建并的过程来进行一个额外的操作,然后所以说咱们在这儿呢,咱们返回的是什么?返回的就是我们额外进行操作之后的一个bin对象,那如果说你要不进行额外的操作,咱们直接把bin,大家注意这个,这里面的这个bin就是我们当前IOC容器中所管理的B,知道吧,咱们直接把它返回就行,然后这个是咱们的b name其实就是bin的ID,然后再往下,大家注意这个方法也是因为它属于额外的操作,所以说我们现在咱们可以直接在当前方法中来对我们当前B所对应的对象来加入一些其他的操作啊好。
08:07
那咱们要想看到这个效果,来,咱们在这输出一下,咱们怎么来输出,大家注意啊,然后这个是我们当前咱们的后置后置处理器啊,后置处理器啊的后置处理器的什么方法呢?大家看好,咱们把方法名写过来啊,好,然后把这个复制一下,然后咱们把它给放在这,然后这个是什么方法,是咱们的后置处理器的post process after initialization方法,OK吧,行,那我们把这个东西配置完成之后啊,大家一定要注意它有没有作用呢?它没有任何作用,我们现在要想把它作用于我们IOC容器中的病,大家要注意你的IOC,最起码要认识它。所以说我们需要干嘛,大家看咱们的笔记里面给大家写的,有且必须要配置到咱们的IOC容器中,OK吧,那所以咱们找到咱们的LC容器,然后在这咱们来写一个bin标签,然后它的class,然后等于谁叫做my being post process OK,这样就可以行,然后在这咱们再加上一个ID,比如说就叫做my being post process OK啊行,然后呢,我们把它配置完成之后,下面咱们在这咱们再来进行测试,然后我们来一个执行啊,咱们把这个B的作用域啊给它去掉,咱们还是用默认的作用域来进行验证啊好,下面我们来一个执行,大家看,然后这个时候它的生命周期大家看一下,是不是在咱们初始化前后就又加入了两个额外的操作,没问题吧,大家看一下啊。
09:50
好,然后这个东西大家也是简单了解一下就行,因为咱们以后咱们学习的某些内容里面可能会有这个后置处理器,大家要知道它是干什么的,其实就是在咱们生命周期前后去加入一个额外的操作,OK吧,好,那最后一点呢,大家来看这个地方,然后咱们在这给大家描述的有咱们需要注意的就是这个bin的后置处理器,它并不是针对于单独的某一个并生效的,因为你看咱们是怎么来配置的,我们是直接把后置处理器。
10:24
然后配置为一个B放在了IOC容器中,那咱们的这个后置处理器到底是针对于哪一个B来起作用的,大家注意,它是针对于当前IOC容器中的每一个B,它都会有作用,也就是说它会把IOC容器中咱们所配置的B的每一个B的生命周期初始化前后都加上,都加上一个额外的操作,OK吧,好,这个大家一定要注意啊,行,那咱们把这一句话复制一下,然后放在咱们的笔记里面,大家注意,然后在这咱们把它放到这个位置啊,好。
11:01
然后这个时候大家说我们当前咱们的。来这个时候咱们当前咱们的生命周期是不是就变了呀,咱们的生命周期是不是就要变成几个步骤了,咱们就需要变成是这个六个步骤了,然后在这个位置是不是又多了一个,大家看啊,这个是什么叫做后置处理器的什么方法,后置处理器的叫做proposed process before initialization方法,好,然后这个变成第四个步骤,然后咱们的第五个步骤是不是应该是谁,应该是后置处理器的post process,然后AF after initialization方法,OK吧,然后这是咱们的最后一个步骤。在IOC容器关闭时来进行销毁,好。行,那这个是咱们的这个B的一个后置处理器,然后大家呢,去演示一下它的效果就可以啊,然后大家要知道它是干什么的就行。
我来说两句