Spring中如何優雅的使用監聽器模式

天愛有情發表於2020-03-16

Spring中如何優雅的使用監聽器模式

spring中自帶了監聽器元件, spring的監聽器在其內部程式碼中得到了廣泛的應用,

且是著名框架 SpringBoot 的核心元件, 並且各種第三方框架和spring整合也充分使用的spring的監聽器

那麼.... 我們如何在專案中使用Spring的監聽器元件呢??

​ 監聽器模式又可以理解為觀察者模式

​ 監聽器模式的組成有 事件(event) 和 監聽器(listener)

​ 監聽器可以監聽對應的事件,來做對應的業務處理

事件(event) 的建立

只需繼承 ApplicationEvent 即可

public class OrderStatusEvent extends ApplicationEvent {
	
}


複製程式碼

監聽器的建立

實現ApplicationListener 介面即可, ApplicationListener 中的泛型指定為對應的事件

  • 切記要把該監聽器注入到Spring中哦 !!!
@Component
public class OrderStatusListener implements ApplicationListener<OrderStatusEvent> {
	/**
	 * Handle an application event.
	 * @param event the event to respond to
	 */
	public void onApplicationEvent(OrderStatusEvent event) {
        // 監聽到 對應的事件
    }
}


複製程式碼

傳送事件

@Service
public class OrderStatusTest {
    @Autowired
    private ApplicationContext applicationContext;
    
    public void sendEvent() {
        // 傳送 OrderStatusEvent 事件 , 傳送完成後,監聽該事件的監聽器就會監聽到該事件
        applicationContext.publishEvent(new OrderStatusEvent("orderID"));
    }
    
}


複製程式碼
  • 這樣就能傳送我們想傳送事件了, 對業務程式碼的解耦以及擴充套件使用該監聽器模型非常的有用且方便

拋開現象看本質

Spring真正實現該功能的類是 SimpleApplicationEventMulticaster , 如果你不想用

ApplicationContext, 你可以使用該物件來傳送事件 該物件實現了ApplicationEventMulticaster 介面

該介面定義了 監聽器和事件相關的方法

public interface ApplicationEventMulticaster {

	/**
	新增一個Listener
	 */
	void addApplicationListener(ApplicationListener<?> listener);

	/**
	新增一個由spring管理的listener
	*/
	void removeApplicationListener(ApplicationListener<?> listener);

	/**
	 刪除一個 由spring管理的listener
	 */
	void removeApplicationListenerBean(String listenerBeanName);

	/**
	刪除所有的listener
	 */
	void removeAllListeners();

	/**
	傳送事件
	 */
	void multicastEvent(ApplicationEvent event);

	/**
		傳送事件,帶有該事件的型別
	 */
	void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType);

}


複製程式碼

擴充套件

Spring

上面我們說過spring內部大量的使用了該功能,我們來看看它內部定義了一些什麼事件

  • 上下文啟動時傳送的事件 ContextStartedEvent # ApplicationContext注入到BeanFactory後會執行start方法觸發該事件
  • 上下文停止時傳送的事件ContextStoppedEvent, #銷燬bean時會呼叫該事件
  • 上下文關閉時傳送的事件 ContextClosedEvent, #銷燬bean時會呼叫該事件
  • 上下文刷完成新時傳送的事件ContextRefreshedEvent, # 重新整理完成時會呼叫該事件

等等....

SpringBoot

springboot大量的使用了"事件驅動"模式,我們看看它又定義了哪些事件呢?

  • SpringBoot 啟動啟動前傳送的事件 ApplicationStartingEvent(application,args)

  • SpringBoot配置環境變數前傳送的事件ApplicationEnvironmentPreparedEvent(application,args,environment)

  • SpringBoot載入上下文前傳送的事件ApplicationContextInitializedEvent(application,args,context)

  • SpringBoot載入上下文完成傳送的事件

    ApplicationPreparedEvent(application, args, context)

  • SpringBoot started完成, 呼叫context.refresh方法後

    ApplicationStartedEvent(application, args, context)

  • SpringBoot啟動異常時傳送的事件

    ApplicationFailedEvent(this.application, this.args, context, exception)

  • SpringBoot啟動完成後傳送的事件

    ApplicationReadyEvent(application, args, context)

  • 除此之外還有很多,就不一一列舉了, SpringBoot正是使用了監聽器模式,

    才使得它整體的擴充套件性更加的如魚得水, SpringBoot架構的成功離不開這個監聽器元件

    我們剛學SpringBoot的時候老說它的架構像個“八爪魚”一樣, 現在明白為什麼這麼叫了吧...

總結

監聽器模式的優勢很明顯, 在自己專案中靈活運用肯定能讓自己的程式碼健壯性、擴充套件性、可讀性、都有一個提升!

關鍵是Spring幫我們提供了這個元件,用起來更加的方便!!!

----------------------------------------- 廣告時間 -----------------------------------------

各位看官,  歡迎關注公眾號,每天推送滿滿的“乾貨”哦!!!

Spring中如何優雅的使用監聽器模式

相關文章