博客 / 詳情

返回

聊聊Spring事件:自己的一些學習筆記和心得

Spring 事件機制

1.1 核心概念

1.1.1 事件(Event)

  • 事件是繼承自 ApplicationEvent 的類,用於封裝需要傳遞的信息。
  • 事件通常是自定義的,表示某種特定的動作或狀態變化。
import org.springframework.context.ApplicationEvent;

public class MyCustomEvent extends ApplicationEvent {
    private final String message;

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

    public String getMessage() {
        return message;
    }
}

1.1.2 事件發佈者(Publisher)

  • 使用 ApplicationEventPublisher 發佈事件。
  • Spring 的任何 Bean 都可以是一個事件發佈者。
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

@Component
public class MyEventPublisher {
    private final ApplicationEventPublisher publisher;

    public MyEventPublisher(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    public void publishEvent(String message) {
        MyCustomEvent event = new MyCustomEvent(this, message);
        publisher.publishEvent(event);
    }
}

1.1.3 事件監聽器(Listener)

  • 使用 @EventListener 或實現 ApplicationListener 接口來監聽事件。
  • 當事件被觸發時,監聽器會執行對應的邏輯。

基於註解的監聽器:

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class MyEventListener {
    @EventListener
    public void handleMyCustomEvent(MyCustomEvent event) {
        System.out.println("Received event - " + event.getMessage());
    }
}

實現接口的監聽器:

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MyEventListener implements ApplicationListener<MyCustomEvent> {
    @Override
    public void onApplicationEvent(MyCustomEvent event) {
        System.out.println("Received event - " + event.getMessage());
    }
}

1.2 事件機制流程

  • 事件發佈者調用 publishEvent() 發佈一個事件。
  • Spring 的事件廣播器(SimpleApplicationEventMulticaster)負責將事件分發給所有符合條件的監聽器。
  • 監聽器接收到事件並執行對應的處理邏輯。

1.3 實際應用場景

  1. 解耦業務邏輯:比如,用户註冊成功後發送歡迎郵件和日誌記錄,兩個操作通過事件機制解耦。
  2. 應用狀態變化通知:系統中某個模塊狀態變化時,通知其他模塊執行相關處理。
  3. 異步事件處理:Spring 事件機制支持異步事件處理(通過線程池)。
@Component
public class AsyncEventListener {
    @EventListener
    @Async
    public void handleEvent(MyCustomEvent event) {
        System.out.println("Processing event asynchronously: " + event.getMessage());
    }
}

1.4 常見注意事項

  1. 默認情況下,事件監聽器在同一個線程中執行,可以通過 @Async 實現異步。
  2. 自定義事件必須繼承 ApplicationEvent(Spring 4.2+ 不強制要求,但推薦這樣做)。
  3. 發佈事件的組件需要被 Spring 容器管理。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.