資料內(nèi)容:
1. 簡介
1.1 ApplicationEvent
ApplicationEvent 是 Spring 框架中的一個重要概念,它是基于觀察者模式的事件。簡單來說,它是一個用
于在 Spring 應(yīng)用程序上下文中傳播信息的對象。當(dāng)某個特定的事件發(fā)生時,ApplicationEvent 對象會被創(chuàng)
建并發(fā)布到 ApplicationContext 中,所有注冊監(jiān)聽該事件的監(jiān)聽器就會收到通知并執(zhí)行相應(yīng)的操作。
ApplicationEvent 是一個泛型類,可以用來傳遞任何類型的數(shù)據(jù)。當(dāng)事件被發(fā)布時,所有注冊的監(jiān)聽器將會
接收到一個 ApplicationEvent 對象,通過該對象的 getSource() 方法可以獲取到事件源,即觸發(fā)事件的組
件。同時,通過 getTimestamp() 方法可以獲取到事件發(fā)生的時間戳。
1.2 ApplicationListener
ApplicationListener 是 Spring 框架中的一個接口,用于監(jiān)聽容器中發(fā)布的事件。這個接口定義了一個方
法:void onApplicationEvent(E event),當(dāng)某個 ApplicationEvent 被發(fā)布時,所有注冊監(jiān)聽該事件的
ApplicationListener 將會被調(diào)用。
ApplicationListener 是一個泛型接口,其參數(shù) E 代表事件的類型。開發(fā)者需要實(shí)現(xiàn)這個接口,并指定要監(jiān)聽
的事件類型。例如,如果要監(jiān)聽 CustomEvent 類型的事件,可以創(chuàng)建一個實(shí)現(xiàn)了 ApplicationListener 接口
的類。
1.3 @EventListener
@EventListener 是一個 Spring 框架提供的注解,用于實(shí)現(xiàn)事件驅(qū)動編程。它允許定義事件和事件監(jiān)聽器,
當(dāng)事件被觸發(fā)時,所有注冊監(jiān)聽該事件的監(jiān)聽器將會被調(diào)用。
public class MyCustomEvent extends ApplicationEvent {
private String message;
public MyCustomEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
public interface ApplicationListener<E extends ApplicationEvent> {
void onApplicationEvent(E event);
}
2. 使用示例
2.1 監(jiān)聽事件
2.1.1 使用ApplicationListener
要監(jiān)聽事件,需要實(shí)現(xiàn) ApplicationListener 接口,并指定要監(jiān)聽的事件類型。然后,可以將這個監(jiān)聽器
注冊到 ApplicationContext 中。
2.1.2 使用@EventListener
在該類中定義一個帶有 @EventListener 注解的方法。這個方法將在事件被觸發(fā)時自動執(zhí)行。
如果希望通過一定的條件對事件進(jìn)行過濾,可以使用 @EventListener 的 condition 屬性。以下實(shí)例中只有
event 的 message屬性是 my-event 時才會進(jìn)行調(diào)用。
@Component
public class MyCustomEventListener implements ApplicationListener<MyCustomEvent> {
@Override
public void onApplicationEvent(MyCustomEvent event) {
System.out.println("Received event: " + event.getMessage());
}
}
@Component
public class MyCustomListener {
@EventListener
public void handleMyCustomEvent(MyCustomEvent event) {
System.out.println("Received event: " + event.getMessage());
}
}