最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring觀察者模式之事件發(fā)布訂閱實現(xiàn)和源碼詳解

 更新時間:2024年01月09日 08:50:06   作者:it_lihongmin  
這篇文章主要介紹了Spring觀察者模式之事件發(fā)布訂閱實現(xiàn)和源碼詳解,Spring認(rèn)為發(fā)布訂閱主題,其實可以理解為事件驅(qū)動的編碼,先來實現(xiàn)以下Spring容器中的事件發(fā)布訂閱,需要的朋友可以參考下

前言

我們現(xiàn)在很多時候開發(fā)環(huán)境已經(jīng)在Spring的ApplicationContext容器中,已經(jīng)必須要自己再去使用jdk實現(xiàn)。

Spring認(rèn)為發(fā)布訂閱主題,其實可以理解為事件驅(qū)動的編碼,先來實現(xiàn)以下Spring容器中的事件發(fā)布訂閱。

個人認(rèn)為事件驅(qū)動的發(fā)布訂閱模型,也算是觀察者模式(不論是推還是拉的方式)。

spring事件驅(qū)動(特別是SpringBoot擴(kuò)展后)可以很方便的進(jìn)行實現(xiàn),那么肯定不會自己去使用Observer的模式。

1、Spring事件的發(fā)送方式

可以使用下面兩種方式,但其實都是一樣的,后面進(jìn)行分析:

  • applicationContext.publishEvent(new UserEvent(user));
  • applicationEventPublisher.publishEvent(new UserEvent(user));
@Service("eventUserService")
public class UserService implements ApplicationContextAware, 
    ApplicationEventPublisherAware {
 
    private ApplicationContext applicationContext;
    private ApplicationEventPublisher applicationEventPublisher;
 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
 
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }
 
    public String addUser(User user) {
        // 保存用戶
        user.setId(1L);
        user.setName("name-1");
        // 發(fā)生事件(發(fā)郵件、發(fā)短信、、、)
        applicationContext.publishEvent(new UserEvent(user));
        // 兩種發(fā)送方式一致
        applicationEventPublisher.publishEvent(new UserEvent(user));
        return "ok";
    }
 
}

2、Spring事件的接收方式

1)、繼承ApplicationListener 接口,實現(xiàn)onApplicationEvent方法

詳細(xì)見我寫的Spring源碼分析:Spring源碼-事件監(jiān)聽機(jī)制(實現(xiàn)EventListener接口)

總結(jié)

1、ApplicationContext發(fā)送事件是委托給了一個Spring容器在refresh時初始化的SimpleApplicationEventMulticaster

bean(由于沒有初始化內(nèi)部線程池對象,所以事件是同步發(fā)送的)。

2、發(fā)送前先獲取事件的ResolvableType類型(當(dāng)前為OrderEvent clazz)和事件源類型(當(dāng)前為String)

3、獲取監(jiān)聽者列表。 先去自己Bean內(nèi)部先查詢緩存,否則從BeanFactory中獲取所有單利bean進(jìn)行匹配(再放入緩存ConturrentHashMap)。

4、監(jiān)聽者列表循環(huán)(同步或異步)地調(diào)用我們自己寫的監(jiān)聽方法OnApplicationEvent。

相同和不同之處

相同:

1、ApplicationContext的refresh方法還是初始化了SimpleApplicationEventMulticaster

2、發(fā)送事件式還是先獲取ResolvableType類型,再獲取發(fā)送監(jiān)聽列表

不同:

1、獲取監(jiān)聽列表返回的已經(jīng)是處理過的列表。

2、添加了@EventListener注解的自定義名稱的方法,會在EventListenerMethodProcessor中的afterSingletonsInstantiated()方法中遍歷所有 ApplicationContext容器的單利bean。將所有添加了@EventListener的方法注入到ApplicationContext的applicationListeners和 初始化的SimpleApplicationEventMulticaster的defaultRetriever.applicationListeners中,在發(fā)送事件時候獲取監(jiān)聽列表時用。

到此這篇關(guān)于Spring觀察者模式之事件發(fā)布訂閱實現(xiàn)和源碼詳解的文章就介紹到這了,更多相關(guān)Spring事件發(fā)布訂閱實現(xiàn)和源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

五寨县| 利辛县| 西盟| 库尔勒市| 长岛县| 高碑店市| 弋阳县| 建宁县| 黔西县| 禄丰县| 微博| 周宁县| 久治县| 清徐县| 吴旗县| 玉环县| 惠州市| 梓潼县| 高州市| 米易县| 南昌市| 墨竹工卡县| 凤凰县| 太湖县| 东丰县| 九龙城区| 图木舒克市| 伊春市| 永新县| 邢台市| 武义县| 荣成市| 平武县| 平乡县| 上思县| 安宁市| 祁连县| 东丰县| 汾阳市| 海丰县| 达日县|