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 方式,更多可以基於以下參考來源