Spring Boot ‐ Event - CCH0124/spring-sandbox GitHub Wiki

事件發布是 ApplicationContext 提供的功能之一。

  • publisher 應該注入一個 ApplicationEventPublisher 物件。
  • listener 應該實作 ApplicationListener 介面。

Custom Event

Spring 允許創建和發布自定義事件,這些事件默認為同步的。這有一些優點,例如,監聽器(listener)能夠參與發佈者的事務上下文。

Created Event

import org.springframework.context.ApplicationEvent;

public class CustomEvent extends ApplicationEvent {

    private String message;

    public CustomEvent(Object source, final String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
    
}

A Publisher

創建一個該事件的發佈者。發佈者構建事件對象並將其發佈給任何正在監聽或訂閱的人。要發布事件,發布者只需注入 ApplicationEventPublisher 並使用 publishEvent() API

import java.util.logging.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

@Component
public class CustomEventPublisher {
    private Logger log = Logger.getLogger(CustomEventPublisher.class.toString());
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void publishCustomEvent(final String message) {
        log.info("Publishing custom event.");
        CustomEvent customSpringEvent = new CustomEvent(this, message);
        applicationEventPublisher.publishEvent(customSpringEvent);
    }
}

Created Listener

監聽器的唯一要求是一個 bean 並實作 ApplicationListener 介面:

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {

     private Logger log = Logger.getLogger(CustomEventListener.class.toString());

    @Override
    public void onApplicationEvent(@SuppressWarnings("null") CustomEvent event) {
        log.info("Received spring custom event - " + event.getMessage());
    }
    
}

Testing

@SpringBootTest
public class EventTest {
    @Autowired
    ApplicationEventPublisher publisher;

    @Test
    public void eventTest() {
        publisher.publishEvent(new CustomEvent(this, "test"));
    }

}
// 2024-09-21T21:49:53.908+08:00  INFO 162979 --- [           main] c.e.synchronous.CustomEventListener      : Received spring custom event - test

當然還有非同步和基於 Transaction 方式,更多可以基於以下參考來源