帶你自定義實現Spring事件驅動模型

卡斯特梅的雨傘發表於2022-01-12

Spring 事件驅動模型概念

Spring 事件驅動模型就是觀察者模式很經典的一個應用,我們可以通過Spring 事件驅動模型來完成程式碼的解耦。

三角色

Spring 事件驅動模型或者說觀察者模式需要三個類角色來支撐完成。分表是:

  • 事件——ApplicationEvent
  • 事件監聽者——ApplicationListener
  • 事件釋出者——ApplicationEventPublisher,ApplicationContext

步驟

  1. 定義一個事件: 實現一個繼承自 ApplicationEvent,並且寫相應的建構函式;
  2. 定義一個事件監聽者:實現 ApplicationListener 介面,重寫 onApplicationEvent() 方法;
  3. 使用事件釋出者釋出訊息: 可以通過 ApplicationEventPublisherpublishEvent() 方法釋出訊息。

程式碼示例

// 定義一個事件,繼承自ApplicationEvent並且寫相應的建構函式 注意這個事件是給釋出者建立出來傳送事件的,
// 所有不能加 @Component
public class MyApplicationEvent extends ApplicationEvent {

    private String message;

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

    public String getMessage() {
        return message;
    }

}

//// 釋出事件,我們依賴於spring自帶的applicationContext來發布事件,applicationContext實現了ApplicationEventPublisher 介面
@Component
public class MyApplicationEventPublisher {
    @Autowired
    ApplicationContext applicationContext;

    public void publish(String message) {
        applicationContext.publishEvent(new MyApplicationEvent(this, message));
    }
}

//// 定義一個事件監聽者,實現ApplicationListener介面,重寫 onApplicationEvent() 方法
//注意泛型列是監聽的事件類名
@Component
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {


    @Override
    public void onApplicationEvent(MyApplicationEvent myApplicationEvent) {
        System.out.println(myApplicationEvent.getMessage());
    }
}

//測試類
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class EventTest {

    @Autowired
    MyApplicationEventPublisher myApplicationEventPublisher;

    @Test
    public void test(){
        myApplicationEventPublisher.publish("hello world");
    }
    //hello world
}

參考

Spring使用的設計模式

相關文章