国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springboot監(jiān)聽器的使用(ApplicationListener、SmartApplicationListener、@EventListener)

這篇具有很好參考價(jià)值的文章主要介紹了springboot監(jiān)聽器的使用(ApplicationListener、SmartApplicationListener、@EventListener)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

監(jiān)聽器: 當(dāng)某個(gè)事件觸發(fā)的時(shí)候,就會(huì)執(zhí)行的方法塊。

springboot提供了兩個(gè)接口來實(shí)現(xiàn)監(jiān)聽:ApplicationListener、SmartApplicationListener,如下圖。顯而易見,SmartApplicationListenerApplicationListener 的子類,故而其功能要強(qiáng)于 ApplicationListener
applicationlistener,Spring Boot,spring boot,listener
applicationlistener,Spring Boot,spring boot,listener

當(dāng)然,springboot很貼心地提供了一個(gè) @EventListener 注解來實(shí)現(xiàn)監(jiān)聽。

1. ApplicationListener

1. 簡單的全局監(jiān)聽

首先,先來簡單體驗(yàn)一下監(jiān)聽器的功能。

需求: 在spring容器初始化完成之后就開始監(jiān)聽,并打印日志。

實(shí)現(xiàn):

  • 準(zhǔn)備springboot工程(依賴:springboot、lombok)

  • 寫一個(gè)監(jiān)聽器

    @Slf4j
    @Component
    public class MyTask implements ApplicationListener<ContextRefreshedEvent> {
    
        private static boolean aFlag = false;
    
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            if (!aFlag) {
                aFlag = true;
                log.info("我已經(jīng)監(jiān)聽到了");
            }
        }
    }
    
  • 啟動(dòng)項(xiàng)目,控制臺(tái)輸出如下:
    applicationlistener,Spring Boot,spring boot,listener

現(xiàn)在來說一下為什么要這么寫監(jiān)聽器:

  • 實(shí)現(xiàn)接口

    implements ApplicationListener<ContextRefreshedEvent>
    

    自定義監(jiān)聽器需要實(shí)現(xiàn) ApplicationListener<E extends ApplicationEvent> 接口

    ContextRefreshedEvent 是一個(gè)事件,它會(huì)在 spring容器初始化完成 之后被觸發(fā),所以監(jiān)聽器就會(huì)在 spring容器初始化完成之后開始監(jiān)聽,所以這就是所謂的全局監(jiān)聽

  • 標(biāo)志位 aFlag

    private static boolean aFlag = false;
    

    aFlag 是一個(gè)啟動(dòng)標(biāo)志
    因?yàn)閣eb應(yīng)用會(huì)出現(xiàn)父子容器,這樣就會(huì)觸發(fā)兩次監(jiān)聽任務(wù),所以需要一個(gè)標(biāo)志位,保證監(jiān)聽任務(wù)(log.info(“我已經(jīng)監(jiān)聽到了”))只會(huì)觸發(fā)一次

2. 定時(shí)任務(wù)

需求: 實(shí)現(xiàn)一個(gè)定時(shí)任務(wù),每間隔5秒、10秒、15秒、20秒、25秒、30秒、40秒、50秒、60秒,在控制臺(tái)打印一次日志。

實(shí)現(xiàn): 可通過多線程的方式實(shí)現(xiàn)

  • 新建一個(gè)類 TimerRunner 繼承 Runnable

  • 5秒到60秒的間隔可以通過 枚舉類實(shí)現(xiàn)

    private enum TimerEnum {
        // 第5秒打印
        FIRST(1, 5 ),
        // 第10秒打印
        SECOND(2, 10),
        // 第15秒打印
        THIRD(3, 15),
        // 第20秒打印
        FOURTH(4, 20),
        // 第25秒打印
        FIFTH(5, 25),
        // 第30秒打印
        SIXTH(6, 30),
        // 第40秒打印
        SEVENTH(7, 40),
        // 第50秒打印
        EIGHTH(8, 50),
        // 第60秒打印
        NINTH(9, 60);
    
        private Integer count;
    
        private Integer time;
    
        TimerEnum(Integer count, Integer time) {
            this.count = count;
            this.time = time;
        }
    
        public Integer getCount() {
            return count;
        }
    
        public Integer getTime() {
            return time;
        }
    }
    
  • TimeRunner 完整代碼

    @Slf4j
    public class TimerRunner implements Runnable{
        @Override
        public void run() {
            // 打印次數(shù)
            int count = 1;
            SimpleDateFormat dateFormat= new SimpleDateFormat("hh:mm:ss");
            for (TimerEnum item: TimerEnum.values()) {
                if (count == item.getCount()) {
                    if (count != 9) {
                        log.info("時(shí)間: " + dateFormat.format(new Date()) + "第 " + count + " 次打印,還剩余 " + (9 - count) + " 次完成打印");
                        count++;
                    } else {
                        log.info("最后一次打印");
                        log.info("已完成所有打印任務(wù)!");
                    }
                }
                try {
                	// TimeUnit來sleep,可讀性更好
                    TimeUnit.SECONDS.sleep(item.getTime());
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    
        private enum TimerEnum {
            // 第5秒打印
            FIRST(1, 5 ),
            // 第10秒打印
            SECOND(2, 10),
            // 第15秒打印
            THIRD(3, 15),
            // 第20秒打印
            FOURTH(4, 20),
            // 第25秒打印
            FIFTH(5, 25),
            // 第30秒打印
            SIXTH(6, 30),
            // 第40秒打印
            SEVENTH(7, 40),
            // 第50秒打印
            EIGHTH(8, 50),
            // 第60秒打印
            NINTH(9, 60);
    
            private Integer count;
    
            private Integer time;
    
            TimerEnum(Integer count, Integer time) {
                this.count = count;
                this.time = time;
            }
    
            public Integer getCount() {
                return count;
            }
    
            public Integer getTime() {
                return time;
            }
        }
    }
    
  • MyTask 代碼

    @Slf4j
    @Component
    public class MyTask implements ApplicationListener<ContextRefreshedEvent> {
    
        private static boolean aFlag = false;
    
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            if (!aFlag) {
                aFlag = true;
                new Thread(new TimerRunner()).start();
            }
        }
    }
    
  • 控制臺(tái)輸出:
    applicationlistener,Spring Boot,spring boot,listener

3. 監(jiān)聽自定義事件

Spring的 ApplicationContext 提供了支持事件和代碼中監(jiān)聽器的功能。
我們可以創(chuàng)建bean用來監(jiān)聽在 ApplicationContext 中發(fā)布的事件。ApplicationEvent 類在 ApplicationContext 接口中處理的事件,如果一個(gè)bean實(shí)現(xiàn)了 ApplicationListener 接口,當(dāng)一個(gè) ApplicationEvent 被發(fā)布以后,bean會(huì)自動(dòng)被通知。


參考鏈接:https://cloud.tencent.com/developer/article/1532994

applicationlistener,Spring Boot,spring boot,listener

先來看一下 spring的內(nèi)置事件

內(nèi)置事件: 參考鏈接: https://blog.csdn.net/liyantianmin/article/details/81017960

事件 說明
ContextRefreshedEvent ApplicationContext 被初始化或刷新時(shí),該事件被發(fā)布。這也可以在 ConfigurableApplicationContext接口中使用 refresh() 方法來發(fā)生。此處的初始化是指:所有的Bean被成功裝載,后處理Bean被檢測并激活,所有Singleton Bean 被預(yù)實(shí)例化,ApplicationContext容器已就緒可用。
ContextStartedEvent 當(dāng)使用 ConfigurableApplicationContext (ApplicationContext子接口)接口中的 start() 方法啟動(dòng) ApplicationContext 時(shí),該事件被發(fā)布。你可以調(diào)查你的數(shù)據(jù)庫,或者你可以在接受到這個(gè)事件后重啟任何停止的應(yīng)用程序。
ContextStoppedEvent 當(dāng)使用 ConfigurableApplicationContext 接口中的 stop() 停止 ApplicationContext 時(shí),發(fā)布這個(gè)事件。你可以在接受到這個(gè)事件后做必要的清理的工作。
ContextClosedEvent 當(dāng)使用 ConfigurableApplicationContext 接口中的 close() 方法關(guān)閉 ApplicationContext 時(shí),該事件被發(fā)布。一個(gè)已關(guān)閉的上下文到達(dá)生命周期末端;它不能被刷新或重啟。
RequestHandledEvent 這是一個(gè) web-specific 事件,告訴所有 bean HTTP 請求已經(jīng)被服務(wù)。只能應(yīng)用于使用DispatcherServlet的Web應(yīng)用。在使用Spring作為前端的MVC控制器時(shí),當(dāng)Spring處理用戶請求結(jié)束后,系統(tǒng)會(huì)自動(dòng)觸發(fā)該事件。

自定義監(jiān)聽事件:

  • extends ApplicationEvent 自定義事件

    public class MyEvent extends ApplicationEvent {
    
        private String time = new SimpleDateFormat("hh:mm:ss").format(new Date());
        private String msg;
    
        public MyEvent(Object source, String msg) {
            super(source);
            this.msg = msg;
        }
    
        public MyEvent(Object source) {
            super(source);
        }
    
        public String getTime() {
            return time;
        }
    
        public void setTime(String time) {
            this.time = time;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    }
    
  • 監(jiān)聽器

    @Slf4j
    @Component
    public class MyTask implements ApplicationListener {
    
        private static boolean aFlag = false;
    
    
        @Override
        public void onApplicationEvent(ApplicationEvent event) {
            if (event instanceof ContextRefreshedEvent) {
                log.info("監(jiān)聽到 ContextRefreshedEvent...");
            }
            if (event instanceof MyEvent) {
                log.info("監(jiān)聽到 MyEvent...");
                MyEvent myEvent = (MyEvent) event;
                System.out.println("時(shí)間:" + myEvent.getTime() + " 信息:" + myEvent.getMsg());
            }
        }
    }
    
  • 觸發(fā)事件
    自定義監(jiān)聽事件需要主動(dòng)觸發(fā)

    @SpringBootApplication
    public class TaskApplication {
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(TaskApplication.class, args);
            MyEvent event = new MyEvent("event", "忙中歲月忙中遣,我本愚來性不移");
            // 發(fā)布事件
            run.publishEvent(event);
        }
    }
    

    也可以這樣觸發(fā),美觀一點(diǎn)

    @SpringBootApplication
    public class TaskApplication implements CommandLineRunner {
        public static void main(String[] args) {
            SpringApplication.run(TaskApplication.class, args);
        }
    
        @Resource
        private ApplicationContext applicationContext;
    
        @Override
        public void run(String... args) throws Exception {
            MyEvent event = new MyEvent("event", "忙中歲月忙中遣,我本愚來性不移");
            // 發(fā)布事件
            applicationContext.publishEvent(event);
    
        }
    }
    
  • 控制臺(tái)輸出
    applicationlistener,Spring Boot,spring boot,listener

2. SmartApplicationListener

1. 簡單使用

@Slf4j
@Component
public class MyTask implements SmartApplicationListener {
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return eventType == MyEvent.class || eventType == ContextRefreshedEvent.class;
    }

    @Override
    public int getOrder() {
        return 0;
    }

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextRefreshedEvent) {
            log.info("監(jiān)聽到 ContextRefreshedEvent...");
        }
        if (event instanceof MyEvent) {
            log.info("監(jiān)聽到 MyEvent...");
            MyEvent myEvent = (MyEvent) event;
            System.out.println("時(shí)間:" + myEvent.getTime() + " 信息:" + myEvent.getMsg());
        }
    }
}
applicationlistener,Spring Boot,spring boot,listener

2. 方法介紹

public interface SmartApplicationListener extends ApplicationListener<ApplicationEvent>, Ordered {

	boolean supportsEventType(Class<? extends ApplicationEvent> eventType);

	default boolean supportsSourceType(@Nullable Class<?> sourceType) {
		return true;
	}

	@Override
	default int getOrder() {
		return LOWEST_PRECEDENCE;
	}

	default String getListenerId() {
		return "";
	}

}
方法 說明
supportsEventType 確認(rèn)當(dāng)前監(jiān)聽器是否支持當(dāng)前事件類型。
supportsSourceType 確定此監(jiān)聽器是否實(shí)際支持給定的源類型。
getOrder 確定此偵聽器在同一事件的一組偵聽器中的順序。數(shù)值越小,優(yōu)先級(jí)越高。
getListenerId 返回偵聽器的可選標(biāo)識(shí)符。

3. @EventListener

使用:

@Slf4j
@Component
public class MyTask {
    @EventListener
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextRefreshedEvent) {
            log.info("監(jiān)聽到 ContextRefreshedEvent...");
        }
        if (event instanceof MyEvent) {
            log.info("監(jiān)聽到 MyEvent...");
            MyEvent myEvent = (MyEvent) event;
            System.out.println("時(shí)間:" + myEvent.getTime() + " 信息:" + myEvent.getMsg());
        }
    }
}
@Slf4j
@Component
public class MyTask {
    @EventListener
    public void MyEventListener(MyEvent event) {
        log.info("監(jiān)聽到 MyEvent...");
        MyEvent myEvent = (MyEvent) event;
        System.out.println("時(shí)間:" + myEvent.getTime() + " 信息:" + myEvent.getMsg());
    }

    @EventListener
    public void ContextRefreshedEventListener(MyEvent event) {
        log.info("監(jiān)聽到 ContextRefreshedEvent...");
    }
}

指定監(jiān)聽事件的類型:文章來源地址http://www.zghlxwxcb.cn/news/detail-791580.html

@EventListener(MyEvent.class)

@EventListener({MyEvent.class, ContextRefreshedEvent.class})

到了這里,關(guān)于springboot監(jiān)聽器的使用(ApplicationListener、SmartApplicationListener、@EventListener)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot2.0(過濾器,監(jiān)聽器,攔截器)

    SpringBoot2.0(過濾器,監(jiān)聽器,攔截器)

    使用Servlet3.0的注解進(jìn)行配置 啟動(dòng)類里面增加 @ServletComponentScan ,進(jìn)行掃描 新建一個(gè)Filter類,implements Filter ,并實(shí)現(xiàn)對應(yīng)接口 @WebFilter 標(biāo)記一個(gè)類為Filter,被spring進(jìn)行掃描 urlPatterns:攔截規(guī)則,支持正則 控制chain.doFilter的方法的調(diào)用,來實(shí)現(xiàn)是否通過放行, 不放行的話,web應(yīng)用

    2024年02月07日
    瀏覽(21)
  • 207、SpringBoot 整合 RabbitMQ 實(shí)現(xiàn)消息的發(fā)送 與 接收(監(jiān)聽器)

    207、SpringBoot 整合 RabbitMQ 實(shí)現(xiàn)消息的發(fā)送 與 接收(監(jiān)聽器)

    1、ContentUtil 先定義常量 2、RabbitMQConfig 創(chuàng)建隊(duì)列的兩種方式之一: 配置式: 在容器中配置 org.springframework.amqp.core.Queue 類型的Bean,RabbitMQ將會(huì)自動(dòng)為該Bean創(chuàng)建對應(yīng)的隊(duì)列。 就是在配置類中創(chuàng)建一個(gè)生成消息隊(duì)列的@Bean。 問題: 用 @Configuration 注解聲明為配置類,但是項(xiàng)目啟動(dòng)

    2024年02月06日
    瀏覽(26)
  • Vue3監(jiān)聽器使用

    Vue3監(jiān)聽器使用

    watch(監(jiān)聽的對象或值, 回調(diào)函數(shù)(參數(shù)新值,舊值), 配置項(xiàng)是對象={ ? immediate: true//立即監(jiān)聽--進(jìn)入就會(huì)執(zhí)行一次 deep:true //深度監(jiān)聽 }) 首先引入 設(shè)置響應(yīng)式數(shù)據(jù) 設(shè)置點(diǎn)擊事件,點(diǎn)擊觸發(fā)修改num 監(jiān)聽簡單數(shù)據(jù)類型-----?immediate: true//立即監(jiān)聽--進(jìn)入就會(huì)執(zhí)行一次 ---------------

    2024年02月07日
    瀏覽(24)
  • JMeter關(guān)于influxDB 2.x 后端監(jiān)聽器使用

    JMeter關(guān)于influxDB 2.x 后端監(jiān)聽器使用

    目前大部分資料都是介紹有關(guān)?jmeter 與 influxdb1.x 版本的集成,但是,在 2021 年,influxdb 升級(jí)到 2.x 版本,這個(gè)版本與 1.x 版本有結(jié)構(gòu)性的調(diào)整,完全不兼容,直接要切換過來難度不小,官網(wǎng)和社區(qū)這方面的資料也不多,所以我邊用邊做個(gè)筆記,方便自我查閱,有需要的人也可

    2023年04月10日
    瀏覽(21)
  • Flutter中的AppLifecycleListener:應(yīng)用生命周期監(jiān)聽器介紹及使用

    引言 當(dāng)你在Flutter中需要監(jiān)聽?wèi)?yīng)用程序的生命周期變化時(shí),可以使用 AppLifecycleListener 。在Flutter 3.13中, AppLifecycleListener 被添加到Framework中,用于監(jiān)聽?wèi)?yīng)用程序的生命周期變化,并響應(yīng)退出應(yīng)用程序的請求等支持。 在Flutter 3.13之前,我們通常使用 WidgetsBindingObserver 的 didChange

    2024年01月20日
    瀏覽(25)
  • Unity UGUI的EventTrigger (事件監(jiān)聽器)組件的介紹及使用

    EventTrigger是Unity UGUI中的一個(gè)組件,用于監(jiān)聽和響應(yīng)UI元素的各種事件,例如點(diǎn)擊、拖拽、進(jìn)入、離開等。通過EventTrigger組件,我們可以方便地為UI元素添加各種交互行為。 EventTrigger組件通過監(jiān)聽UI元素上的事件,并在事件觸發(fā)時(shí)執(zhí)行相應(yīng)的回調(diào)函數(shù)。每個(gè)UI元素可以添加多個(gè)

    2024年02月15日
    瀏覽(20)
  • HttpSessionListener監(jiān)聽器和HttpSessionAttributeListener監(jiān)聽器

    1.作用:監(jiān)聽Session創(chuàng)建或銷毀,即生命周期監(jiān)聽 2.相關(guān)方法: 3.使用場景: 和前面的ServletContextListener等一樣,可以用于監(jiān)控用戶上線和離線 4.代碼 HttpSessionListener監(jiān)聽器 實(shí)現(xiàn)類 HttpSessionAttributeListener監(jiān)聽器 1.作用:監(jiān)聽Session屬性的變化,使用少 2.相關(guān)方法: 3.代碼 監(jiān)聽器 實(shí)

    2024年02月04日
    瀏覽(20)
  • Listener監(jiān)聽器----HttpServletRequest對象的生命周期監(jiān)聽器

    一、HttpServletRequest對象的生命周期監(jiān)聽器 ????????ServletRequestListener接口定義了ServletRequest(是HttpServletRequest接口的父接口類型)對象生命周期的監(jiān)聽行為。 void requestInitialized(ServletRequestEvent sre) ??????? HttpServletRequest對象創(chuàng)建后會(huì)觸發(fā)該監(jiān)聽器方法,并將已創(chuàng)建HttpServletR

    2024年01月23日
    瀏覽(23)
  • camunda執(zhí)行監(jiān)聽器和任務(wù)監(jiān)聽器有什么區(qū)別

    camunda執(zhí)行監(jiān)聽器和任務(wù)監(jiān)聽器有什么區(qū)別

    Camunda的執(zhí)行監(jiān)聽器和任務(wù)監(jiān)聽器是用于添加自定義邏輯的監(jiān)聽器,它們的區(qū)別在于作用對象和觸發(fā)事件的不同。 執(zhí)行監(jiān)聽器是與BPMN流程中的各種流程元素(例如開始事件、用戶任務(wù)、服務(wù)任務(wù)、網(wǎng)關(guān)等)相關(guān)聯(lián)的。執(zhí)行監(jiān)聽器可以在流程元素執(zhí)行前、執(zhí)行后或拋出異常時(shí)添

    2024年02月04日
    瀏覽(39)
  • 消息監(jiān)聽器和消息監(jiān)聽容器

    前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。 消息監(jiān)聽器顧名思義用來接收消息,它是使用消息監(jiān)聽容器的必須條件。目前有8個(gè)消息監(jiān)聽器: 使用自動(dòng)提交或容器管理的提交方法之一,處理從 Kafka 消費(fèi)者 p

    2024年02月07日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包