00:00
好,上一节课呢,我们来写了一个监听器,也就是application listener的咱们这个实现类,通过写这个监听器呢,我们来监听容器中的事件,只要容器中有事件发布我们监听器的方法就会得到回调,那么当然我们也可以自己利用IC容器的publish event来自定义发布一个事件,我们自己来发布事件,那么咱们这个事件呢,整个发布和监听机制又是怎么样的呢?我们可以来说一下咱们这个原理,那么这个原理呢,我们先来进行测试,我们现在呢,容器中我们收到了三个事件,哎,我们这三个事件都是怎么收到的,一个叫contest refer event,还有一个我们自己的事件,哎,我们自己发布的这个事件,还有一个叫contest close event,我们可以分别看一下这三个事件我们是怎么收到的,那接下来我们就给我们这个。
01:00
哎,事件监听的这个方法上,我来打一个断点,我们来以debug的方式运行走好,现在呢,我们来到了这个方法,现在我们来看收到的事件啊,第一个事件是contest refsh的event,我们来看第一个事件contest re的event时间,我们是怎么收到它的呢?我们来看一下整个流程,在TEST01我们容器创建对象的时候,好,这是我们第一步,第步容器创建对象,这个容器创建对象的时候呢,会调用我们这个refresh方法进行容器刷新工作,玩呢来创建容器里边的所有being刷新容器等工作,接下来呢,我们来看这个refresh里边,诶它掉了一个叫finish resh,最后一步啊,完成容器的这个刷新,但是呢,我们前面我们都知道容器刷新这个步骤还挺多。
02:00
我们之前呢,大致的看过几个步骤,比如我们说这个啊,执行factor post process啊,我们之前说过,包括呢,我们给容器中注册咱们这个后置处理器,我们也说过等等等等,那么呢,我们接下来看这个在容器刷新的最后一步,也说容器刷新完成finish,也就说容器咱们就要刷新完成,刷新完成的时候呢,我们来进去来看刷新完成的这个方法,他呢调了一个叫publish event,诶来看正好呢叫发布事件,他呢new了一个contest refresh的event,诶要说呢,容器刷新完成,他来publish了一个event,发布了一个事件,这个事件呢,正是我们第一个啊感知到的事件,叫容器刷新完成的事件,那么这个事件呢,我们来看它是怎么发布的publish event,我们来点。
03:00
点进去哎,看到它的上一级,它调用publish event,好再在这,哎publish event我们来看在这,然后呢,他在下边调了这个方法,这个方法呢,它先获取到application event,获取到咱们这个应用事件的,我们叫派发器,嗯,也叫多波器是吧,这是它的整个事件的发布流程,发布流程首先呢,第一个获取到获取咱们这个事件的多波器,我们叫多波器,或者呢,你也叫派发器。啊,派发器所谓的多波器,就是我们把这个事件要发送给多个鉴定器,让他们同时感知,啊,这是第一步,它获取到这个啊application疑问multi,然后呢,我们来看第二步,他拿到这个multi以后呢,它会调multi疑问的方法,好,我们来点它上一步,哎,他调了这个multicat疑问的方法。
04:04
然后呢,我们这个event就是我们这个派发事件。啊,它就是我们这个派发事件,这个事件派发它是怎么派发的呢?我们可以来看一下它呢,在这儿首先呢,看这个for循环,它这是get application listeners,拿到所有的application listener,然后呢挨个便利,然后呢,这一块还有一个判断,如果ex,也就说如果有我们的这个可以利用ex进行异步执行的功能的话,我们就可以诶用多线程的方式来异步的派发时间,如果没有,那我们就同步的啊整个循环每一次遍历我们来执行这个监听器的方法,好,所以呢,它的步骤是这个for循环,大家注意它的步骤,拿到它派发事件,怎么派发呢?它是获取到所有的到所有的application application。
05:11
哎,就是这个for循环,这个for循环,然后呢,拿到每一个application呢,他还做了一个判断,哎,他在这个判断呢,它是有没有这个task ex会返回一个ex,也就说利用我们GDK里边呢,这个框架呢,可以来进行支持我们这个异步派发事件。哎,我们可以可以,如果有ex,哎可以支持,可以支持使用咱们这个ex进行进行进行咱们这个异步判罚,比方说呢,它这有一个这个判断,而我们现在呢,我们是进入到了第二个else环节,就是说呢,我们来直接执行listen,哎执行listen如果是异步模式,它是用异步的方式执行listen,那么呢,我们来看啊,执行listen,我们第二步直行否则,否则同步的方式,直接执行方式,直接执行咱们这个listener方法,哎它呢调了一个叫invo listener。
06:35
那这个work listener怎么调的呢?他把我们当前遍利的这个listener传过来,那可想而知了,我们来看啊们来点进去work listener,就是呢,他调doing work listen呢,那再点进去,也就说把我们这个listen呢,拿到回调他的on application疑问的方法,所以说呢,就会来到,就会来到我们当前的这个listen,回调他的这个application疑问的方法,比如说呢,拿到listen,拿到咱们这个回调,回调咱们这个on a离开event方法,这就是我们这个流程,就是事件发布的流程,事件怎么发布呢?你调用publish event,哎,整个呢,你调用publish event,我们把它放在前面,你调用publish event,那么呢,我给你拿到事件的多波。
07:35
器,然后给你派发时间,那么这是我们收到的第一个时间contest re的event,我们可以来看一下,好执行到我们来走控制台呢,打印我们收到的第一个事件叫contest re event,那接下来第二个事件呢,我们来放行,来到这个方法执行,但是第二个事件是我们自己,诶自己来调用这个publish event的,哎,你看我们是来到方法的26行,我们自己调用这个逻辑,那么逻辑一模一样,我们来点进去还是调用publish,你问进来拿到咱们的多波器,然后呢进行多个派发来执行list索呢,怎么执行呢?我们来看在这呢执行离呢,它的前面就是找到所有的离呢,帮我们来挨个执行,如果有异步来用异步的方式,然后呢执行list,拿到我们这个list呢,回掉它的application application event啊,这是我们第二个时间比说第一个呢,是我们这个容器。
08:35
在刷新完成以后会发布容器,刷新完成会发布contest refresh的event事件,当然了,我们自己也会发布一个事件。哎,这是我们第一个时间,第二个呢,我们也可以,我们也可以自己发布时间,不管是容器发布的时间,还是自己发布的事件,都会走这个事件发布流程,拿到多部器,拿到所有的监听器,挨个毁掉它的方法而已。那么呢,接下来我们来看,那可想而知,最后一个时间是我们这个容器关闭,哎,那么自己发布的时间我们也打印了,那么接下来呢,我们来看最后一行,那么在这调容器关闭的时候怎么关闭呢?点进去,哎,它在这,容器关闭调用do close,好点进去do close呢,它在这,诶publish了一个event,这个event呢,就是容器关闭的时间,好,那这呢是容器关闭,容器关闭会发布这个事件,比如说呢,除过容器里边在各个环节它会默认发布一些事件外,我们也可以自己来发布事件,那不管怎么发布,那事件的发布流程。
09:50
就在这儿,但是呢,我们现在呢,又需要注意一个问题,就是我们是要获取到一个事件的这个多波器,也就说get application,你问multi listen,我们可以看一下它,我们是要获取它的,而这个玩意呢,我们是从哪拿到的呢?我们可以来说一下我们这个事件多波起,也就是我们说的这个事件的派发器,它是怎么拿到的呢?哎,我们这个呢,我们就可以给大家看一下,它是这么拿到的,我们LC容器在创建对象的时候来,我们在这儿要进行refer,可以把这个流程来说一下,容器创建对象,创建对象创建对象,创建对象的时候呢,它会调用resh方法,这个resh方法呢,接下来我们来第二步,我们来看创建对象,我们自己来走。
10:50
Re re呢,会调非常多的方法,其中就有一部叫application eventcaster,诶在这它呢,还是在我们这个完成being其他的这个对象创建之前,会先初始化,我们这个叫multi,诶有一步叫初始化我们的application multister,那它的初始化逻辑是怎么样的呢?我们也可以来看一看,好in点进来其实很简单,它就呢从IOC容器,也就说being factor从being工厂中找到,我们先来找有没有,我们一个ID名叫application,问他multi cost的组件,它是这样的,它的规则先去先去容器中找有没有。
11:50
有没有ID等于我们这个的组件,那么如果有,那当然用它来进去,再来看你问它好,要说呢,我们如果有这个multi卡T就从容器中,哎,通过get并的方式拿到这个组件,如果没有呢,你看人家就拗一个,哎,人家自己就创建一个简单的application event multi啊,如果没有就用自己的,如果没有,相当于我们也自己可以给容器中添一个,如果没有,他就是利用这个办法,哎,他自己来拗一个,拗一个呢,然后呢,把我们这个motive也注册到咱们这个容器的单式利比应中,方便,哎,我们扭出来的对象,我们再注册到容器中去,那么你以后其他的组件就可以来自动注入的这个。
12:50
中间所以说如果没有,那就哎,他用拗了一个的方式。哎,他用这个方式创建了一个它并且呢,并且加入到容器中,哎,它掉了最后一个方法叫register加进来,那加进来以后呢,我们就可以就可以在其他组件要派发事件的时候,要派发事件我们只需要自动注入,自动注入这个multicaster就行了,自动注入这个你问他multi就行,这就是我们这个事件派发器,它是怎么来的,就是这么来的,那么现在呢,又有一个原因,它是怎么,哎,它通过get啊不对,开声listen呢,它怎么知道容器中有哪些监听器呢?咱们这个容器中有哪些监听器,其实呢,这个也就更简单了,因为我们把监听器是不是加到容器中了。
13:57
啊,所以说呢,容器中我他就判断一下哪些组件是A不离开listener就行了,包括这个逻辑我们也可以看到,我们呢,还是在容器创建对象的时候,我们刚才有一步来流星,你看啊,在这一块呢,是初始化我们这个事件派发器,我们按照这个名字,我们也看到逻辑,但是在这注意这是注册什么注册listen呢?注册监听器来点进来看一下,它怎么注册呢?它是拿到所有的这个listen呢,当然这第一次呢,这个listen呢,里边如果我们没有,你看啊,它是在这get being for type,也就说按从容器中拿到所有A离开listen类型的这些listen组件,把这些组件呢,还添加到派发器中,注册到派发器中,那以后这些组件就能用了,诶它就是这个样子,它就是从容器中,哎,在还是一样容。
14:57
既在创建对象的时候,有一步容器在创建对象要进行刷新,刷新的时候呢,还有一步是要进行来注册,所有的监听器在这儿。
15:12
它有一步叫注册监听器,注册监听器的作用就是呢,从容器中,从容器中拿到所有的监听器,然后呢,把他们把他们注册到multister中,Application even到multi中,这样我们这个派发器里边它就有,到底我们容器中有多少的Li呢?派发器呢,直接给这些Li呢把时间派发出去,所以说呢,就是这么一个流程,大家注意诶,就是说如果找到了这个组件,它呢,就把它注册到派发器中,哎,注意啊,下面的这个功能,将咱们这个listen注册到咱们这个application multicaster中,哎,这就是呢,我们整个事件派发的流程,当然我们在整个事件派发的过程中,我们发现,哎,我们可以自定义事件派发器。
16:13
包括呢,我们在自定义的时候,我们也可以给它啊,我们让它传一个我们支持异步的们点进去,VC中呢,有一个spring中有一个叫anthic,哎,这个呢是同步的占有一个,哎哎上面呢这是一个同步的,然后呢下面呢这是一个异步,也就说呢,可以有两种,咱们这个task们可以在自定义发器的时候,我们也给它传过去,让它呢能支持同步跟异步。同步跟异步。
我来说两句