三万字盘点Spring/Boot的那些常用扩展点( 五 )


这两个其实不是通过SPI机制来扩展,而是直接从容器中获取的,这又是为啥呢?
因为调用和时,已经启动成功了,容器都准备好了,需要什么Bean直接从容器中查找多方便 。
而前面说的几个需要SPI机制的扩展点,是因为在启动的时候,容器还没有启动好,也就是无法从容器获取到这些扩展的对象,为了兼顾扩展性,所以就通过SPI机制来实现获取到实现类 。
刷新上下文和调用加载和调用
所以要想扩展这个点,只需要实现接口,添加到容器就可以了 。
Event 事件
Event 事件可以说是一种观察者模式的实现,主要是用来解耦合的 。当发生了某件事,只要发布一个事件,对这个事件的监听者(观察者)就可以对事件进行响应或者处理 。
举个例子来说,假设发生了火灾,可能需要打119、救人,那么就可以基于事件的模型来实现,只需要打119、救人监听火灾的发生就行了,当发生了火灾,通知这些打119、救人去触发相应的逻辑操作 。
什么是 Event 事件
那么是什么是 Event 事件,就是实现了这种事件模型,你只需要基于提供的API进行扩展,就可以完成事件的发布订阅
提供的事件api:
事件的父类,所有具体的事件都得继承这个类,构造方法的参数是这个事件携带的参数,监听器就可以通过这个参数来进行一些业务操作 。
事件监听的接口,泛型是子类需要监听的事件类型,子类需要实现,参数就是事件类型,方法的实现就代表了对事件的处理,当事件发生时,会回调方法的实现,传入发布的事件 。
isher
isher
事件发布器,通过方法就可以发布一个事件,然后就可以触发监听这个事件的监听器的回调 。
实现了isher接口,所以通过就可以发布事件 。
那怎么才能拿到呢?
前面Bean生命周期那节说过,可以通过are接口拿到,甚至你可以通过实现直接获取到isher,其实获取到的isher也就是,因为是实现了isher 。
话不多说,上代码
就以上面的火灾为例
第一步:创建一个火灾事件类
火灾事件类继承
1
2
3
4
5
6
7
8
// 火灾事件
ent {
( ) {
super();
}
}
第二步:创建火灾事件的监听器
打119的火灾事件的监听器:
1
2
3
4
5
6
7
8
ener {
@
( event) {
.out.("打119");
}
}
救人的火灾事件的监听器:
1
2
3
4
5
6
7
8
{
@
( event) {
.out.("救人");
}
}
事件和对应的监听都有了,接下来进行测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
on {
([] args) {
=();
//将 事件监听器 注册到容器中
.(ener.class);
.(.class);
.();
// 发布着火的事件,触发监听
.(("着火了"));
}
}
将两个事件注册到容器中,然后发布事件
运行结果:
1
2
打119
救人
控制台打印出了结果,触发了监听 。
如果现在需要对火灾进行救火,那么只需要去监听,实现救火的逻辑,注入到容器中,就可以了,其余的代码根本不用动 。
内置的事件
内置的事件很多,这里我罗列几个
事件类型触发时机
t
在调用 接口中的()方法时触发
在调用的start()方法时触发
在调用的stop()方法时触发
当被关闭时触发该事件,也就是调用close()方法触发