您好,登錄后才能下訂單哦!
這篇文章主要介紹“基于Spring實現觀察者模式的方法步驟”,在日常操作中,相信很多人在基于Spring實現觀察者模式的方法步驟問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于Spring實現觀察者模式的方法步驟”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
觀察者模式定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新,其主要解決一個對象狀態改變給其他關聯對象通知的問題,保證易用和低耦合。一個典型的應用場景是:當用戶注冊以后,需要給用戶發送郵件,發送優惠券等操作,如下圖所示。
UserService 在完成自身的用戶注冊邏輯之后,僅僅只需要發布一個 UserRegisterEvent 事件,而無需關注其它拓展邏輯。其它 Service 可以自己訂閱 UserRegisterEvent 事件,實現自定義的拓展邏輯。Spring的事件機制主要由3個部分組成。
ApplicationEvent:通過繼承它,實現自定義事件。另外,通過它的 source 屬性可以獲取事件源,timestamp 屬性可以獲得發生時間。
ApplicationEventPublisher:通過實現它,來發布變更事件。
ApplicationEventListener:通過實現它,來監聽指定類型事件并響應動作。這里就以上面的用戶注冊為例,來看看代碼示例。首先定義用戶注冊事件 UserRegisterEvent。
publicclass UserRegisterEvent extends ApplicationEvent { /** * 用戶名 */ private String username; public UserRegisterEvent(Object source) { super(source); } public UserRegisterEvent(Object source, String username) { super(source); this.username = username; } public String getUsername() { return username; } }
然后定義用戶注冊服務類,實現 ApplicationEventPublisherAware 接口,從而將 ApplicationEventPublisher 注入進來。從下面代碼可以看到,在執行完注冊邏輯后,調用了 ApplicationEventPublisher的 publishEvent(ApplicationEvent event) 方法,發布了 UserRegisterEvent 事件。
@Service publicclass UserService implements ApplicationEventPublisherAware { // <1> private Logger logger = LoggerFactory.getLogger(getClass()); private ApplicationEventPublisher applicationEventPublisher; @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; } public void register(String username) { // ... 執行注冊邏輯 logger.info("[register][執行用戶({}) 的注冊邏輯]", username); // <2> ... 發布 applicationEventPublisher.publishEvent(new UserRegisterEvent(this, username)); } }
創建郵箱Service,實現 ApplicationListener 接口,通過 E 泛型設置感興趣的事件,實現 onApplicationEvent(E event) 方法,針對監聽的 UserRegisterEvent 事件,進行自定義處理。
@Service publicclass EmailService implements ApplicationListener<UserRegisterEvent> { // <1> private Logger logger = LoggerFactory.getLogger(getClass()); @Override @Async// <3> public void onApplicationEvent(UserRegisterEvent event) { // <2> logger.info("[onApplicationEvent][給用戶({}) 發送郵件]", event.getUsername()); } }
創建優惠券Service,不同于上面的實現 ApplicationListener 接口方式,在方法上,添加 @EventListener 注解,并設置監聽的事件為 UserRegisterEvent。這是另一種使用方式。
@Service publicclass CouponService { private Logger logger = LoggerFactory.getLogger(getClass()); @EventListener// <1> public void addCoupon(UserRegisterEvent event) { logger.info("[addCoupon][給用戶({}) 發放優惠劵]", event.getUsername()); } }
看到這里,細心的同學可能想到了發布訂閱模式,其實觀察者模式于發布訂閱還是有區別的,簡單來說,發布訂閱模式屬于廣義上的觀察者模式,在觀察者模式的 Subject 和 Observer 的基礎上,引入 Event Channel 這個中介,進一步解耦。圖示如下,可以看出,觀察者模式更加輕量,通常用于單機,而發布訂閱模式相對而言更重一些,通常用于分布式環境下的消息通知場景。
到此,關于“基于Spring實現觀察者模式的方法步驟”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。