Springboot中如何自定義監(jiān)聽器
一、監(jiān)聽器模式圖
二、監(jiān)聽器三要素廣播器:
- 廣播器:用來發(fā)布事件
- 事件:需要被傳播的消息
- 監(jiān)聽器:一個(gè)對(duì)象對(duì)一個(gè)事件的發(fā)生做出反應(yīng),這個(gè)對(duì)象就是事件監(jiān)聽器
三、監(jiān)聽器的實(shí)現(xiàn)方式
1、實(shí)現(xiàn)自定義事件
自定義事件需要繼承ApplicationEvent類,并添加一個(gè)構(gòu)造函數(shù),用于接收事件源對(duì)象。
該事件中添加了一個(gè)SysUser對(duì)象,用于傳遞用戶信息。
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、實(shí)現(xiàn)自定義監(jiān)聽器
自定義監(jiān)聽器需要實(shí)現(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ā)布,實(shí)際應(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方法,控制臺(tái)會(huì)輸出以下內(nèi)容:
發(fā)布MyEvent事件。。。
監(jiān)聽到了事件,用戶名:zhangsan
5、其他實(shí)現(xiàn)方案
主要是監(jiān)聽器的注冊(cè)方式不同,目的只有一個(gè),把監(jiān)聽器加入到spring容器中。
方式一,就是上面的MyEventListener類是通過@Component注解將該類注冊(cè)為Spring的Bean,從而實(shí)現(xiàn)監(jiān)聽器的功能。
方式二,可以通過在啟動(dòng)類中添加監(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; /** * 啟動(dòng)程序 * * @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注解實(shí)現(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中實(shí)現(xiàn)監(jiān)聽器的四種方式。
至于監(jiān)聽器的實(shí)現(xiàn)原理,后續(xù)再補(bǔ)充。
到此這篇關(guān)于Springboot中自定義監(jiān)聽器的文章就介紹到這了,更多相關(guān)Springboot自定義監(jiān)聽器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java基礎(chǔ)之字符串編碼知識(shí)點(diǎn)總結(jié)
這篇文章主要介紹了java基礎(chǔ)之字符串編碼總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,要的朋友可以參考下2021-04-04java組件smartupload實(shí)現(xiàn)上傳文件功能
這篇文章主要為大家詳細(xì)介紹了java組件smartupload實(shí)現(xiàn)上傳文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10SpringBoot配置logback.xml 多環(huán)境的操作步驟
最近在研究springboot的日志,所以記錄一下,做一下總結(jié),今天重點(diǎn)給大家介紹SpringBoot配置logback.xml 多環(huán)境的操作步驟,要實(shí)現(xiàn)多環(huán)境的配置,主要是依賴于springboot的application.yml文件去實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧2021-05-05java搭建ftp/sftp進(jìn)行數(shù)據(jù)傳遞的全過程
ftp是一種文件傳輸協(xié)議,讓客戶端和服務(wù)端能夠互相傳遞文件,圖片等數(shù)據(jù),sftp也是一種文件傳輸協(xié)議,但是相比較而言要比ftp安全性更好些,但是也有缺點(diǎn)就是傳輸效率低2021-07-07Springboot引入hibernate配置自動(dòng)建表并進(jìn)行增刪改查操作
這篇文章主要介紹了Springboot引入hibernate配置自動(dòng)建表并進(jìn)行增刪改查,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09java自定義填充excel并導(dǎo)出的方法代碼實(shí)例
這篇文章主要給大家介紹了關(guān)于java自定義填充excel并導(dǎo)出的相關(guān)資料,使用Java在Spring框架中實(shí)現(xiàn)一個(gè)接口,該接口可以將JSON數(shù)據(jù)導(dǎo)出為Excel文件,文章涵蓋了從加載Excel模板、創(chuàng)建單元格樣式到填充數(shù)據(jù)并返回響應(yīng)的整個(gè)過程,需要的朋友可以參考下2024-12-12