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

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

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

前言

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

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

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

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

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

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

  • 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方法

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

總結

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

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

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

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

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

相同和不同之處

相同:

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

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

不同:

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

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

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

相關文章

最新評論

通渭县| 铁力市| 郑州市| 渭南市| 温泉县| 巴塘县| 大渡口区| 台前县| 岑巩县| 绍兴县| 仁布县| 塔河县| 贵德县| 玉山县| 威远县| 稻城县| 北碚区| 清新县| 苍溪县| 麻江县| 青海省| 凌海市| 吉木乃县| 安义县| 大方县| 湖口县| 桓仁| 锦屏县| 双流县| 海口市| 连城县| 博白县| 翁牛特旗| 太保市| 余江县| 扶沟县| 武胜县| 资源县| 贵德县| 赞皇县| 开江县|