Springboot中如何自定義監(jiān)聽器
一、監(jiān)聽器模式圖
二、監(jiān)聽器三要素廣播器:
- 廣播器:用來發(fā)布事件
- 事件:需要被傳播的消息
- 監(jiān)聽器:一個對象對一個事件的發(fā)生做出反應(yīng),這個對象就是事件監(jiān)聽器
三、監(jiān)聽器的實現(xiàn)方式
1、實現(xiàn)自定義事件
自定義事件需要繼承ApplicationEvent類,并添加一個構(gòu)造函數(shù),用于接收事件源對象。
該事件中添加了一個SysUser對象,用于傳遞用戶信息。
package com.ruoyi.web.listener; import com.ruoyi.common.core.domain.entity.SysUser; import org.springframework.context.ApplicationEvent; /** * @Description: 自定義事件 * @Author: baiwen * @createTime: 2024年06月19日 13:10:07 */ public class MyEvent extends ApplicationEvent { private SysUser sysUser; public MyEvent(Object source, SysUser sysUser) { super(source); this.sysUser = sysUser; } public SysUser getSysUser() { return sysUser; } }
2、實現(xiàn)自定義監(jiān)聽器
自定義監(jiān)聽器需要實現(xiàn)ApplicationListener接口,并重寫 onApplicationEvent方法。
接口中的泛型參數(shù)為自定義事件類型,表示監(jiān)聽該類型的事件。
可以從該事件中獲取用戶信息,并進(jìn)行相應(yīng)的處理。
package com.ruoyi.web.listener; import com.ruoyi.common.core.domain.entity.SysUser; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; /** * @Description: 自定義監(jiān)聽器 * @Author: baiwen * @createTime: 2024年06月19日 13:12:39 */ @Component public class MyEventListener implements ApplicationListener<MyEvent> { @Override public void onApplicationEvent(MyEvent event) { SysUser sysUser = event.getSysUser(); System.out.println("監(jiān)聽到了事件,用戶名:" + sysUser.getUserName()); } }
3、發(fā)布自定義事件
在需要發(fā)布事件的地方,使用ApplicationEventPublisher的publishEvent方法來發(fā)布事件。
這里使用Test類來模擬事件發(fā)布,實際應(yīng)用中可以根據(jù)具體需求來選擇合適的發(fā)布場景。
package com.ruoyi.test; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.web.listener.MyEvent; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationEventPublisher; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; /** * @Description: * @Author: baiwen * @createTime: 2024年06月19日 13:16:33 */ @SpringBootTest @RunWith(SpringRunner.class) public class MyEventPushTest { @Resource private ApplicationEventPublisher applicationEventPublisher; @Test public void testpublishEvent() throws InterruptedException { SysUser sysUser = new SysUser(); sysUser.setUserName("zhangsan"); System.out.println("發(fā)布MyEvent事件。。。"); applicationEventPublisher.publishEvent(new MyEvent(this, sysUser)); } }
4、測試
運(yùn)行MyEventPushTest類中的testpublishEvent方法,控制臺會輸出以下內(nèi)容:
發(fā)布MyEvent事件。。。
監(jiān)聽到了事件,用戶名:zhangsan
5、其他實現(xiàn)方案
主要是監(jiān)聽器的注冊方式不同,目的只有一個,把監(jiān)聽器加入到spring容器中。
方式一,就是上面的MyEventListener類是通過@Component注解將該類注冊為Spring的Bean,從而實現(xiàn)監(jiān)聽器的功能。
方式二,可以通過在啟動類中添加監(jiān)聽器的方式,使監(jiān)聽器生效。
package com.ruoyi; import com.ruoyi.web.listener.MyEventListener; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; /** * 啟動程序 * * @author baiwen */ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class RuoYiApplication { public static void main(String[] args) { new SpringApplicationBuilder(RuoYiApplication.class).listeners(new MyEventListener()).run(args); } }
方式三,可以通過配置spring.factories,使監(jiān)聽器生效。
在resource文件夾下創(chuàng)建META-INF/spring.factories文件。
配置內(nèi)容如下:
# 監(jiān)聽器 org.springframework.context.ApplicationListener=com.ruoyi.web.listener.MyEventListener
除此之外,還有第四種方式,通過@EventListener注解實現(xiàn)監(jiān)聽器的功能。
通過@EventListener注解的condition屬性來指定監(jiān)聽的事件類型。
package com.ruoyi.web.listener; import com.ruoyi.common.core.domain.entity.SysUser; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; /** * @Description: 自定義監(jiān)聽器2 * @Author: baiwen * @createTime: 2024年06月19日 14:07:57 */ @Component public class MyEventListener2 { @EventListener(MyEvent.class) public void listenerApplicationStarted(MyEvent event) { SysUser sysUser = event.getSysUser(); System.out.println("注解方式監(jiān)聽到了事件,用戶名:" + sysUser.getUserName()); } }
發(fā)布事件后,可以看到能正常監(jiān)聽到事件。
發(fā)布MyEvent事件。。。 注解方式監(jiān)聽到了事件,用戶名:zhangsan
???????總結(jié)
以上,就是SpringBoot中實現(xiàn)監(jiān)聽器的四種方式。
至于監(jiān)聽器的實現(xiàn)原理,后續(xù)再補(bǔ)充。
到此這篇關(guān)于Springboot中自定義監(jiān)聽器的文章就介紹到這了,更多相關(guān)Springboot自定義監(jiān)聽器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java組件smartupload實現(xiàn)上傳文件功能
這篇文章主要為大家詳細(xì)介紹了java組件smartupload實現(xiàn)上傳文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10SpringBoot配置logback.xml 多環(huán)境的操作步驟
最近在研究springboot的日志,所以記錄一下,做一下總結(jié),今天重點給大家介紹SpringBoot配置logback.xml 多環(huán)境的操作步驟,要實現(xiàn)多環(huán)境的配置,主要是依賴于springboot的application.yml文件去實現(xiàn),感興趣的朋友跟隨小編一起看看吧2021-05-05java搭建ftp/sftp進(jìn)行數(shù)據(jù)傳遞的全過程
ftp是一種文件傳輸協(xié)議,讓客戶端和服務(wù)端能夠互相傳遞文件,圖片等數(shù)據(jù),sftp也是一種文件傳輸協(xié)議,但是相比較而言要比ftp安全性更好些,但是也有缺點就是傳輸效率低2021-07-07Springboot引入hibernate配置自動建表并進(jìn)行增刪改查操作
這篇文章主要介紹了Springboot引入hibernate配置自動建表并進(jìn)行增刪改查,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09