Springboot中自定義監聽器

树叶的一生啊發表於2024-06-28

一、監聽器模式圖

二、監聽器三要素

  • 廣播器:用來發布事件
  • 事件:需要被傳播的訊息
  • 監聽器:一個物件對一個事件的發生做出反應,這個物件就是事件監聽器

三、監聽器的實現方式

1、實現自定義事件

自定義事件需要繼承ApplicationEvent類,並新增一個建構函式,用於接收事件源物件。
該事件中新增了一個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、實現自定義監聽器

自定義監聽器需要實現ApplicationListener介面,並重寫 onApplicationEvent方法。
介面中的泛型引數為自定義事件型別,表示監聽該型別的事件。
可以從該事件中獲取使用者資訊,並進行相應的處理。

package com.ruoyi.web.listener;

import com.ruoyi.common.core.domain.entity.SysUser;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

/**
 * @Description: 自定義監聽器
 * @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("監聽到了事件,使用者名稱:" + sysUser.getUserName());
    }
}

3、釋出自定義事件

在需要釋出事件的地方,使用ApplicationEventPublisher的publishEvent方法來發布事件。
這裡使用Test類來模擬事件釋出,實際應用中可以根據具體需求來選擇合適的釋出場景。

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("釋出MyEvent事件。。。");
        applicationEventPublisher.publishEvent(new MyEvent(this, sysUser));
    }
}

4、測試

執行MyEventPushTest類中的testpublishEvent方法,控制檯會輸出以下內容:

釋出MyEvent事件。。。
監聽到了事件,使用者名稱:zhangsan

5、其他實現方案

主要是監聽器的註冊方式不同,目的只有一個,把監聽器加入到spring容器中。

方式一,就是上面的MyEventListener類是透過@Component註解將該類註冊為Spring的Bean,從而實現監聽器的功能。

方式二,可以透過在啟動類中新增監聽器的方式,使監聽器生效。

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,使監聽器生效。

在resource資料夾下建立META-INF/spring.factories檔案。

配置內容如下:

# 監聽器
org.springframework.context.ApplicationListener=com.ruoyi.web.listener.MyEventListener

除此之外,還有第四種方式,透過@EventListener註解實現監聽器的功能。
透過@EventListener註解的condition屬性來指定監聽的事件型別。

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: 自定義監聽器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("註解方式監聽到了事件,使用者名稱:" + sysUser.getUserName());
    }
}

釋出事件後,可以看到能正常監聽到事件。

釋出MyEvent事件。。。
註解方式監聽到了事件,使用者名稱:zhangsan

總結

以上,就是SpringBoot中實現監聽器的四種方式。

至於監聽器的實現原理,後續再補充。

相關文章