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

spring中ApplicationListener的使用小結

 更新時間:2024年07月08日 09:21:43   作者:孟秋與你  
ApplicationListener是spring提供的一個監(jiān)聽器,本文主要介紹了spring中ApplicationListener的使用小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

ApplicationListener 是spring提供的一個監(jiān)聽器,它可以實現(xiàn)一個簡單的發(fā)布-訂閱功能,用有點外行但最簡單通俗的話來解釋:監(jiān)聽到主業(yè)務在執(zhí)行到了某個節(jié)點之后,在監(jiān)聽器里面做出相應的其它業(yè)務變更。下面我們具體看段代碼,則能很快的理解

使用示例:

首先定義一個業(yè)務實體類,實體類定義字段、get set方法、構造函數(shù)

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor

/**
 * 模擬業(yè)務對象實體類
 * @author csdn:孟秋與你
 */
public class MyBizEntity {
    private String name;
    private Integer age;
}

再定義一個事件,事件繼承ApplicationEvent

import org.springframework.context.ApplicationEvent;

/**
 * 自定義事件(繼承ApplicationEvent)
 * @author csdn:孟秋與你
 */
public class MyEvent extends ApplicationEvent {


    public MyEvent(Object source) {
        super(source);
    }
    public MyEvent() {
        // java基礎:如果父類只有有參構造 子類需要使用其它構造函數(shù) 必須在構造函數(shù)第一行調用super 因為子類也是調用父類的構造函數(shù)
        super(null);
        // do other
    }
}

定義一個監(jiān)聽器,實現(xiàn)ApplicationListener接口:

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

/**
 * 監(jiān)聽事件
 */
@Component
public class MyApplicationListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {

        // 必須判斷自己要的類型  因為會監(jiān)聽到所有繼承ApplicationEvent的事件
        if (applicationEvent instanceof MyEvent) {
            Object source = applicationEvent.getSource();
            MyBizEntity bizEntity = (MyBizEntity) source;
            System.out.println(bizEntity.getName() + ":------------name");
        }

    }
}


寫一個接口進行測試, 此時監(jiān)聽器就能打印輸出了

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/test/listener")
@RestController
public class MainBizController {

    @Autowired
    private ApplicationContext context;

    @GetMapping
    public String test() {
        // do something
        
        // 模擬要傳遞的業(yè)務對象
        MyBizEntity bizEntity = new MyBizEntity("name",18);
        MyEvent event = new MyEvent(bizEntity);
        // 上下文 發(fā)布事件
        context.publishEvent(event);
        return "success";
    }
}


原理簡析:

為什么發(fā)布了事件,監(jiān)聽器就能夠監(jiān)聽到呢? 其實原理很簡單,就是spring進行了一個樸實無華的直接調用, 我們來看看源碼:

context.publishEvent默認是調用AbstractApplicationContext類的publishEvent方法,而publishEvent方法里面調用了SimpleApplicationEventMulticaster 類的multicastEvent方法。

tips: 為什么上下文有publishEvent方法 ?
因為ApplicationContext繼承了ApplicationEventPublisher

在這里插入圖片描述

SimpleApplicationEventMulticaster: 首先會獲取所有實現(xiàn)了ApplicationListener的監(jiān)聽器 (get by type就可以獲取到), 接著會執(zhí)行 invokeListener方法

在這里插入圖片描述

我們看看最后doInvokeListener 做了什么:

在這里插入圖片描述

通過上面源碼鏈路,我們不難發(fā)現(xiàn) 其實就是調用了publishEvent方法后,spring在我們不輕易能看到的地方 去調用了一下監(jiān)聽器的onApplicationEvent 方法而已,通過源碼我們也可以看到 默認是同步調用(沒有定義taskExecutor時), 本質上是一個解耦,把原本可能要寫在一起的業(yè)務代碼拆分了。

如何異步發(fā)送

通過源碼可以看到 SimpleApplicationEventMulticaster類的multicastEvent方法,會先獲取Executor ,如果有executor 則通過異步方式發(fā)送

所以問題就變成了這個executor如何才能獲取到值。

在這里插入圖片描述

可以看到該類有一個public的setTaskExecutor方法

在這里插入圖片描述

所以我們可以直接將該類的實例作為一個bean給spring托管,代碼如下

@Configuration
public class EventConfig {

    @Bean(name = "applicationEventMulticaster")
    public SimpleApplicationEventMulticaster simpleApplicationEventMulticaster(TaskExecutor taskExecutor) {
        SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster();
        eventMulticaster.setTaskExecutor(taskExecutor);
        return eventMulticaster;
    }
}

這里涉及到一個spring的基礎知識,上面代碼的參數(shù)是(TaskExecutor taskExecutor) 所以需要先有一個executor bean,代碼示例如下:

@Configuration
public class AsyncInBootConfig {

    /** 核心線程池大小 */
    private int corePoolSize = 20;

    /**
     * 最大可創(chuàng)建的線程數(shù)
     */
    private int maxPoolSize = 50;

    /**
     * 隊列最大長度
     */
    private int queueCapacity = 100;

    /**
     * 線程池維護線程所允許的空閑時間
     */
    private int keepAliveSeconds = 300;

    @Primary
    @Bean(name = "threadPool")
    /**
     * springboot 線程池方式
     */
    public ThreadPoolTaskExecutor threadPoolTaskExecutor()
    {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        executor.setCorePoolSize(corePoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        // 線程池對拒絕任務(無線程可用)的處理策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
}


這樣在發(fā)布消息時,就會使用全局配置的這個threadPool線程池了

到此這篇關于spring中ApplicationListener的使用小結的文章就介紹到這了,更多相關spring ApplicationListener內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MybatisPlus自定義Sql實現(xiàn)多表查詢的示例

    MybatisPlus自定義Sql實現(xiàn)多表查詢的示例

    這篇文章主要介紹了MybatisPlus自定義Sql實現(xiàn)多表查詢的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • MybatisPlus中的insert操作詳解

    MybatisPlus中的insert操作詳解

    這篇文章主要介紹了MybatisPlus中的insert操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java 10的10個新特性總結

    Java 10的10個新特性總結

    這篇文章我們給大家整理了關于Java 10的10個新特性以及相關要點內容,有興趣的朋友們可以參考下。
    2018-08-08
  • IntelliJ?IDEA的代碼擱置功能實現(xiàn)

    IntelliJ?IDEA的代碼擱置功能實現(xiàn)

    本文主要介紹了IntelliJ?IDEA的代碼擱置功能實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Java利用AlphaComposite類合并圖像

    Java利用AlphaComposite類合并圖像

    這篇文章主要介紹了Java利用AlphaComposite類合并圖像,幫助大家更好的利用Java處理圖像,感興趣的朋友可以了解下
    2020-10-10
  • Java通過遞歸算法解決迷宮與漢諾塔及八皇后問題

    Java通過遞歸算法解決迷宮與漢諾塔及八皇后問題

    方法就是用來完成解決某件事情或實現(xiàn)某個功能的辦法;程序調用自身的編程技巧稱為遞歸,本文主要講的是通過遞歸來實現(xiàn)三個經(jīng)典的問題,解決迷宮,漢諾塔,八皇后問題,感興趣的朋友可以參考一下
    2022-05-05
  • logback之自定義指定日志文件存儲目錄方式

    logback之自定義指定日志文件存儲目錄方式

    這篇文章主要介紹了logback之自定義指定日志文件存儲目錄方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JavaWeb監(jiān)聽器Listener實例解析

    JavaWeb監(jiān)聽器Listener實例解析

    這篇文章主要為大家詳細介紹了JavaWeb監(jiān)聽器Listener實例,針對監(jiān)聽器進行進行細致分析,感興趣的小伙伴們可以參考一下
    2016-08-08
  • springboot3.4和mybatis plus的版本問題的解決

    springboot3.4和mybatis plus的版本問題的解決

    本文主要介紹了springboot3.4和mybatis plus的版本問題的解決,主要由于Spring Boot 3.4與MyBatis-Plus版本不匹配導致分頁功能問題,下面就來解決這個問題,感興趣的可以了解一下
    2025-03-03
  • tk.mybatis擴展通用接口使用詳解

    tk.mybatis擴展通用接口使用詳解

    這篇文章主要介紹了tk.mybatis擴展通用接口使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08

最新評論

新密市| 普宁市| 盐山县| 洪江市| 集安市| 冕宁县| 开江县| 保定市| 绥滨县| 郯城县| 洪江市| 五寨县| 巴林右旗| 中卫市| 河北区| 淅川县| 修武县| 钟祥市| 禹城市| 秀山| 墨江| 嘉祥县| 襄城县| 拜城县| 武穴市| 金华市| 大石桥市| 吴江市| 陵水| 萍乡市| 河东区| 刚察县| 五华县| 东至县| 安仁县| 龙口市| 汽车| 镇雄县| 弋阳县| 涞水县| 侯马市|