摘要:背景是事件機(jī)制的一部分,與抽象類(lèi)類(lèi)配合來(lái)完成的事件機(jī)制。如果容器中存在的,當(dāng)調(diào)用方法時(shí),對(duì)應(yīng)的會(huì)被觸發(fā)。單元測(cè)試類(lèi)執(zhí)行單元測(cè)試,會(huì)發(fā)現(xiàn)事件發(fā)布之后,監(jiān)聽(tīng)器方法被調(diào)用,日志被打印出來(lái)。
背景
ApplicationListener是Spring事件機(jī)制的一部分,與抽象類(lèi)ApplicationEvent類(lèi)配合來(lái)完成ApplicationContext的事件機(jī)制。
如果容器中存在A(yíng)pplicationListener的Bean,當(dāng)ApplicationContext調(diào)用publishEvent方法時(shí),對(duì)應(yīng)的Bean會(huì)被觸發(fā)。這一過(guò)程是典型的觀(guān)察者模式的實(shí)現(xiàn)。
ApplicationListener源碼@FunctionalInterface public interface ApplicationListenerContextRefreshedEvent事件的監(jiān)聽(tīng)extends EventListener { /** * Handle an application event. * @param event the event to respond to */ void onApplicationEvent(E event); }
以Spring的內(nèi)置事件ContextRefreshedEvent為例,當(dāng)ApplicationContext被初始化或刷新時(shí),會(huì)觸發(fā)ContextRefreshedEvent事件,下面我們就實(shí)現(xiàn)一個(gè)ApplicationListener來(lái)監(jiān)聽(tīng)此事件的發(fā)生。
@Component // 需對(duì)該類(lèi)進(jìn)行Bean的實(shí)例化 public class LearnListener implements ApplicationListener{ @Override public void onApplicationEvent(ContextRefreshedEvent event) { // 打印容器中出事Bean的數(shù)量 System.out.println("監(jiān)聽(tīng)器獲得容器中初始化Bean數(shù)量:" + event.getApplicationContext().getBeanDefinitionCount()); } }
如上,便完成了一個(gè)事件監(jiān)聽(tīng)類(lèi)的實(shí)現(xiàn)和實(shí)例化。
自定義事件及監(jiān)聽(tīng)首先自定義事件:NotifyEvent。
public class NotifyEvent extends ApplicationEvent { private String email; private String content; public NotifyEvent(Object source) { super(source); } public NotifyEvent(Object source, String email, String content) { super(source); this.email = email; this.content = content; } // 省略getter/setter方法 }
定義監(jiān)聽(tīng)器NotifyListener:
@Component public class NotifyListener implements ApplicationListener{ @Override public void onApplicationEvent(NotifyEvent event) { System.out.println("郵件地址:" + event.getEmail()); System.out.println("郵件內(nèi)容:" + event.getContent()); } }
監(jiān)聽(tīng)器通過(guò)@Component注解進(jìn)行實(shí)例化,并在onApplicationEvent中打印相關(guān)信息。
單元測(cè)試類(lèi):
@RunWith(SpringRunner.class) @SpringBootTest public class ListenerTest { @Autowired private WebApplicationContext webApplicationContext; @Test public void testListener() { NotifyEvent event = new NotifyEvent("object", "abc@qq.com", "This is the content"); webApplicationContext.publishEvent(event); } }
執(zhí)行單元測(cè)試,會(huì)發(fā)現(xiàn)事件發(fā)布之后,監(jiān)聽(tīng)器方法被調(diào)用,日志被打印出來(lái)。
原文鏈接:https://www.choupangxia.com/2...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/75418.html
摘要:準(zhǔn)備好了我們可以開(kāi)始向中發(fā)布,當(dāng)發(fā)布后,所有在中的都會(huì)收到對(duì)應(yīng)的。將類(lèi)注入到的中。測(cè)試和通過(guò)方法將發(fā)布到應(yīng)用上下文中,同時(shí)這個(gè)動(dòng)作會(huì)觸發(fā)收到事件。深入剖析發(fā)布與監(jiān)聽(tīng)的過(guò)程在使用方法發(fā)布的時(shí)候,最終會(huì)調(diào)用到中的類(lèi)的如下的一段代碼。 本篇主要來(lái)聊一聊spring中ApplicationListener接口和ApplicationEvent類(lèi)。 從命名上可以很容易的看出來(lái)一個(gè)是listene...
摘要:在框架中,有多種事件這些時(shí)間會(huì)在不同的運(yùn)行時(shí)刻發(fā)布,來(lái)通知監(jiān)聽(tīng)者。本文僅僅介紹的事件的監(jiān)聽(tīng)。也可以在文件中配置。 spring application listener 在 spring 框架中,有多種事件, 這些時(shí)間會(huì)在不同的運(yùn)行時(shí)刻發(fā)布,來(lái)通知監(jiān)聽(tīng)者。本文僅僅介紹 SpringApplicationEvent 的事件的監(jiān)聽(tīng)。 事件類(lèi)型 EventType 發(fā)布時(shí)間 App...
摘要:創(chuàng)建及準(zhǔn)備創(chuàng)建。目前已知關(guān)心這個(gè)事件的有要注意的是在這個(gè)階段,里只有,是的加載工作的起點(diǎn)。原因是注入這些回調(diào)接口本身沒(méi)有什么意義。在其構(gòu)造函數(shù)內(nèi)部間接的給注冊(cè)了幾個(gè)與相關(guān)注解的處理器。 相關(guān)代碼在: https://github.com/chanjarster/spring-boot-all-callbacks 注:本文基于spring-boot 1.4.1.RELEASE, spri...
摘要:會(huì)一直完善下去,歡迎建議和指導(dǎo),同時(shí)也歡迎中用到了那些設(shè)計(jì)模式中用到了那些設(shè)計(jì)模式這兩個(gè)問(wèn)題,在面試中比較常見(jiàn)。工廠(chǎng)設(shè)計(jì)模式使用工廠(chǎng)模式可以通過(guò)或創(chuàng)建對(duì)象。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問(wèn)題,已經(jīng)開(kāi)源,目前已經(jīng) 41k+ Star。會(huì)一直完善下去,歡迎建議和指導(dǎo),同時(shí)也歡迎Star: https://github.com/Snailclimb... JDK 中用到了那...
摘要:事件事件監(jiān)聽(tīng)器,對(duì)監(jiān)聽(tīng)到的事件進(jìn)行處理。擁有一個(gè)成員變量,提供了容器監(jiān)聽(tīng)器的注冊(cè)表。注冊(cè)事件監(jiān)聽(tīng)器根據(jù)反射機(jī)制,使用的方法,從中找出所有實(shí)現(xiàn)的,將它們注冊(cè)為容器的事件監(jiān)聽(tīng)器,實(shí)際的操作就是將其添加到事件廣播器所提供的監(jiān)聽(tīng)器注冊(cè)表中。 1. Spring的資源抽象接口 假如有一個(gè)文件位于Web應(yīng)用的類(lèi)路徑下,用戶(hù)可以通過(guò)以下方式對(duì)這個(gè)文件資源進(jìn)行訪(fǎng)問(wèn): 通過(guò)FileSystemReso...
閱讀 2696·2021-09-22 15:58
閱讀 2238·2019-08-29 16:06
閱讀 906·2019-08-29 14:14
閱讀 2815·2019-08-29 13:48
閱讀 2459·2019-08-28 18:01
閱讀 1504·2019-08-28 17:52
閱讀 3328·2019-08-26 14:05
閱讀 1623·2019-08-26 13:50