盘点Spring/Boot的那些常用扩展点( 六 )


那怎么才能拿到呢?
前面Bean生命周期那节说过 , 可以通过are接口拿到 , 甚至你可以通过实现直接获取到isher , 其实获取到的isher也就是 , 因为是实现了isher 。
话不多说 , 上代码
就以上面的火灾为例
第一步:创建一个火灾事件类
火灾事件类继承
// 火灾事件
class{
public FireEvent(String source) {super(source);}
}
第二步:创建火灾事件的监听器
打119的火灾事件的监听器:
class ener{
@Overridepublic void onApplicationEvent(FireEvent event) {System.out.println("打119");}
}
救人的火灾事件的监听器:
class{
@Overridepublic void onApplicationEvent(FireEvent event) {System.out.println("救人");}
}
事件和对应的监听都有了 , 接下来进行测试:
class{
public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();//将 事件监听器 注册到容器中applicationContext.register(Call119FireEventListener.class);applicationContext.register(SavePersonFireEventListener.class);applicationContext.refresh();// 发布着火的事件 , 触发监听applicationContext.publishEvent(new FireEvent("着火了"));}
}
将两个事件注册到容器中 , 然后发布事件
运行结果:
打119
救人
控制台打印出了结果 , 触发了监听 。
如果现在需要对火灾进行救火 , 那么只需要去监听 , 实现救火的逻辑 , 注入到容器中 , 就可以了 , 其余的代码根本不用动 。
内置的事件
内置的事件很多 , 这里我罗列几个
事件类型 触发时机
t 在调用 接口中的()方法时触发
在调用的start()方法时触发
在调用的stop()方法时触发
当被关闭时触发该事件 , 也就是调用close()方法触发
在容器启动的过程中 , 会发布这些事件 , 如果你需要这容器启动的某个时刻进行什么操作 , 只需要监听对应的事件即可 。
事件的传播
事件的传播是什么意思呢?
我们都知道 , 在中有子父容器的概念 , 而事件的传播就是指当通过子容器发布一个事件之后 , 不仅可以触发在这个子容器的事件监听器 , 还可以触发在父容器的这个事件的监听器 。
上代码
class ation {
public static void main(String[] args) {// 创建一个父容器AnnotationConfigApplicationContext parentApplicationContext = new AnnotationConfigApplicationContext();//将 打119监听器 注册到父容器中parentApplicationContext.register(Call119FireEventListener.class);parentApplicationContext.refresh();// 创建一个子容器AnnotationConfigApplicationContext childApplicationContext = new AnnotationConfigApplicationContext();//将 救人监听器 注册到子容器中childApplicationContext.register(SavePersonFireEventListener.class);childApplicationContext.refresh();// 设置一下父容器childApplicationContext.setParent(parentApplicationContext);// 通过子容器发布着火的事件 , 触发监听childApplicationContext.publishEvent(new FireEvent("着火了"));}
}
创建了两个容器 , 父容器注册了打119的监听器 , 子容器注册了救人的监听器 , 然后将子父容器通过关联起来 , 最后通过子容器 , 发布了着火的事件 。
运行结果:
救人
打119
从打印的日志 , 的确可以看出 , 虽然是子容器发布了着火的事件 , 但是父容器的监听器也成功监听了着火事件 。