您好,欢迎来到欧得旅游网。
搜索
您的当前位置:首页【玩转SpringBoot】通过事件机制参与SpringBoot应用的启动过程

【玩转SpringBoot】通过事件机制参与SpringBoot应用的启动过程

来源:欧得旅游网
【玩转SpringBoot】通过事件机制参与SpringBoot应⽤的启动过程

⽣命周期和事件监听

⼀个应⽤的启动过程和关闭过程是归属到“⽣命周期”这个概念的范畴。

典型的设计是在启动和关闭过程中会触发⼀系列的“事件”,我们只要监听这些事件,就能参与到这个过程中来。要想监听事件,⾸先得有事件,就是常说的Listener。下⾯就是Spring提供的,如下图01:

按规定所有的都要继承Java提供的EventListener接⼝,这个接⼝是⼀个空的marker接⼝,其实就是标识⼀下。事件⼀般都有多个,⼀般也有两种常⽤解决⽅法:要么定义多个接⼝,⼀个事件⼀个接⼝。要么⼀个接⼝⾥定义多个⽅法,⼀个事件⼀个⽅法。

可惜的是,这两种⽅法Spring都没有采⽤,仍然只⽤了⼀个接⼝⼀个⽅法,那它是如何实现的呢?相信⼤家已经看到,接⼝有⼀个泛型参数,没错,就是根据泛型参数的不同来区分不同事件的。这个泛型参数就是事件对象,按规定所有的事件对象都要继承Java提供的EventObject类,如下图02:

Java提供这个类除了有标识作⽤外,还和事件源有关。任何事件都会有⼀个触发者,它就是事件源。可以认为是事件的起源或来源。既然所有事件都有,⼲脆提升到顶级⽗类⾥算了。如下图03:

不同的事件,含义完全不同,所以差别很⼤,因此,通常⼀种事件会有属于⾃⼰的⼀种事件对象。我们只需要看下事件对象有多少种,就能知道事件有多少种。这种判断⽅式⼀般都没有问题。下⾯就是和SpringBoot启动有关的所有事件对象类型,如下图04:

⼀共有七种事件对象,除去⼀种是处理失败⽤的,还剩六种。也就是说我们可以通过六个事件参与到SpringBoot应⽤的启动中去。

实现事件接⼝

就是接⼝,我们⾸先要实现这些接⼝,加⼊处理逻辑。然后把它们添加到应⽤中去就⾏了。有六种事件对象,我们需要定义六个实现类。事件对象为ApplicationStartingEvent,如下图05:

事件对象为ApplicationEnvironmentPreparedEvent,如下图06:

事件对象为ApplicationContextInitializedEvent,如下图07:

事件对象为ApplicationPreparedEvent,如下图08:

事件对象为ApplicationStartedEvent,如下图09:

事件对象为ApplicationReadyEvent,如下图10:

把这个六个实现类添加到SpringBoot应⽤中,如下图11:

实现Runner接⼝

SpringBoot提供了两个Runner接⼝,如下图1213:

这两个接⼝主要⽤于满⾜那种应⽤刚启动好后就需要⽴马被执⾏的需求。如定时任务。我们也来实现下这两个接⼝,如下图1415:

有⼀点需要注意的是,这两个接⼝的实现类需要作为bean注册到容器中去。

实现Spring容器初始化接⼝

如果我们需要对Spring容器进⾏⼀些⾃定义的初始化,可以实现这个接⼝,如下图16:

这个接⼝的泛型参数其实就是容器对象。我们也来实现下这个接⼝,如下图1718:

我们可以多次实现这个接⼝,需要排序的话可以使⽤@Order注解或实现Ordered接⼝。然后把这些实现类添加到SpringBoot应⽤中去,如下图19:

启动应⽤,观察事件触发的次序

启动后⾸先触发启动事件,如下图20:

接着要做的就是确认环境,创建Environment,然后触发事件,表明环境已经OK了。如下图21:

然后根据环境创建Spring容器对象,创建好后执⾏⾃定义容器初始化,如下图22:

初始化完成后,触发事件,表明容器就已经准备好了,如下图23:

容器OK之后,就会加载资源(主要是注册bean定义),加载完成后,就会触发事件,如下图24:

接着Spring容器就会进⾏refresh,refresh完成之后,其实Spring容器就已经成功启动好了。这时会触发事件,如下图25:

容器启动好后,⽴马就会执⾏Runner,如下图26:

Runner执⾏完后,SpringBoot应⽤就真正启动好了,进⼊了正常运⾏状态。这时会触发最后⼀个事件,如下图27:

我们可以根据需要,在对应的事件⾥完成⾃⼰的需求。

(END)

>>> 玩转SpringBoot系列⽂章 <<<

>>> 品Spring系列⽂章 <<<

>>> 热门⽂章集锦 <<<

作者是⼯作超过10年的码农,现在任架构师。喜欢研究技术,崇尚简单快乐。追求以通俗易懂的语⾔解说技术,希望所有的读者都能看懂并记住。下

⾯是公众号的⼆维码,欢迎关注!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ovod.cn 版权所有 湘ICP备2023023988号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务