springboot中不同模块之间调用
今天在做一个token续签的过滤器的时候,发现过滤器在framework中,而我要在过滤器中调用system中的service去查询数据库的配置参数,system是依赖framework的,反过来的话肯定出错了,于是在无意间看到了这个框架中有一块使用了ApplicationEvent,发现挺好用的,可以跨模块之间进行监听和发布。
1.介绍
ApplicationContext具有发布事件的能力。这是因为该接口继承了ApplicationEventPublisher接口。Spring中与事件有关的接口和类主要包括ApplicationEvent、ApplicationListener。
定义一个事件的类需要继承ApplicationEvent或者ApplicationContextEvent抽象类,该抽象类中只有一个构造函数,并 且带有一个Object类型的参数作为事件源,并且该事件源不能为null,因此我们需要在自己的构造函数中执行super(Object)。
针对一种事件,可能需要特定的监听器,因此,监听器需要实现ApplicationListener接口。当监听器接收到一个事件的时候,就会执行它的 onApplicationEvent()方法。由于Spring IoC中的事件模型是一种简单的、粗粒度的监听模型,当有一个事件到达时,所有的监听器都会接收到,并且作出响应,如果希望只针对某些类型进行监听,需要 在代码中进行控制。
至此便完成了事件的发布,当ApplicationContext接收到事件后,事件的广播是Spring内部给我们做的,不需要了解具体的细节。其实在 Spring读取配置文件之后,利用反射,将所有实现ApplicationListener的Bean找出来,注册为容器的事件监听器。当接收到事件的 时候,Spring会逐个调用事件监听器。剩下要做的就是在配置文件中配置监听器
2.使用
先定义一个ApplicationEvent的子类
在filter中进行发布,使用注入的ApplicationEventPublisher进行发布,传入那个子类以及需要的参数
定义监听器,监听入参是那个子类的方法
然后启动程序,调用接口会发现续签成功
- 本文标签: Spring Boot
- 本文链接: https://blog.wangqi2020.top/article/57
- 版权声明: 本文由王祁原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权