91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于Spring實現觀察者模式的方法步驟

發布時間:2021-10-09 15:59:46 來源:億速云 閱讀:114 作者:iii 欄目:編程語言

這篇文章主要介紹“基于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實現觀察者模式的方法步驟”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

景德镇市| 柯坪县| 江北区| 田东县| 扬中市| 延川县| 金门县| 始兴县| 新昌县| 达拉特旗| 肥东县| 天祝| 丰原市| 亚东县| 万盛区| 鸡西市| 上林县| 东港市| 什邡市| 葫芦岛市| 柯坪县| 建昌县| 双流县| 黄龙县| 章丘市| 余江县| 枣庄市| 新蔡县| 阳新县| 临沭县| 大田县| 洞口县| 怀集县| 万州区| 五河县| 梓潼县| 呼玛县| 司法| 台江县| 德庆县| 龙泉市|