javascript
Spring Boot————ApplicationListener实现逃课事件监听
引言
上一篇文章轉(zhuǎn)了一篇關(guān)于ApplicationListener用于在Web項目啟動時做一些初始化的用法。
但是,在實際生產(chǎn)過程中,當(dāng)一個事件產(chǎn)生,又是如何被onApplicationEvent()方法監(jiān)聽到,并執(zhí)行一系列動作呢?簡單搜索了一下,終于掌握了從定義事件、發(fā)布事件到最后監(jiān)聽方法執(zhí)行的常規(guī)用法,在此記錄。
據(jù)我了解,spring 底層對監(jiān)聽機制的實現(xiàn)應(yīng)該用到了觀察者模式,關(guān)于觀察者模式的解釋可以參考《Java常用設(shè)計模式————觀察者模式》。
本篇博客只涉及到關(guān)于spring 監(jiān)聽機制的用法,不涉及底層的原理(不過有時間的話一定會進(jìn)一步整理底層實現(xiàn)的方式),將會通過事件定義、監(jiān)聽后操作、事件觸發(fā)(發(fā)布)這三個部分來實現(xiàn)一個簡單的業(yè)務(wù)邏輯:監(jiān)聽一個學(xué)生的逃課事件,并在事件觸發(fā)后執(zhí)行一個有效的措施。
實現(xiàn)步驟
1、定義事件類
事件類需要繼承抽象類ApplicationEvent,且必須包含一個有參構(gòu)造器,這個參數(shù)是頂級父類EventObject的一個屬性,標(biāo)識一個與這個事件相關(guān)聯(lián)的資源對象Object。下面代碼中的showSkipStuInfo()方法是一個自定義的方法,用于打印一些日志信息。
@SuppressWarnings("serial") public class SkipClassEvent extends ApplicationEvent {private static final Logger logger = LoggerFactory.getLogger(SkipClassEvent.class);public SkipClassEvent(Object source) {super(source);}/** 顯示逃課學(xué)生信息 */public void showSkipStuInfo(Student stu) {logger.info("逃課學(xué)生信息:" + stu.toString());} }其中,Student是一個只包含 name 和 gender 的簡單Java對象:
/** 學(xué)生對象 */ public class Student {public enum Gender {MALE, FAMALE;}private String name;private Gender gender;public Student(String name, Gender gender) {this.name = name;this.gender = gender;}@Overridepublic String toString() {return "{name : " + name + ", gender : " + gender + "}";}// getter...setter... }2、編寫監(jiān)聽器
自定義的監(jiān)聽器類SkipClassListener實現(xiàn)了ApplicationListener接口的onApplicationEvent方法,并指定監(jiān)聽的事件類型為SkipClassEvent,當(dāng)事件適時觸發(fā)時,spring框架會自行調(diào)用onApplicationEvent方法。
@Component public class SkipClassListener implements ApplicationListener<SkipClassEvent> {private static final Logger logger = LoggerFactory.getLogger(SkipClassListener.class);@Overridepublic void onApplicationEvent(SkipClassEvent event) {Student stu = (Student) event.getSource();event.showSkipStuInfo(stu);logger.info("采取措施:通知" + stu.getName() + "的家長!!!");} }3、事件觸發(fā)
編寫一個最簡單的Spring Boot單元測試,來觀察執(zhí)行效果。
首先,我們必須獲得一個ApplicationContext對象,因為在spring框架中事件的觸發(fā)要使用ApplicationContext對象的publishEvent()方法,實際上從這個方法的命名來看,我們應(yīng)該稱之為“發(fā)布事件”,但本人更喜歡將這個調(diào)用稱為“觸發(fā)事件”,不過這都沒有關(guān)系。
(在實際開發(fā)中,我們也可以像下面代碼這樣通過@Autowired注解,將ApplicationContext注入,或者,通過啟動類的SpringApplication.run(...)得到這個對象,并把它作為一個類屬性(static修飾)來調(diào)用)
@RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests {@Autowiredprivate ApplicationContext applicationContext;@Testpublic void testListener() {Student skipStu = new Student("張明", Gender.MALE);applicationContext.publishEvent(new SkipClassEvent(skipStu));} }測試testListener()方法,執(zhí)行結(jié)果如下:
?
綜上,是對事件監(jiān)聽的常規(guī)用法總結(jié),歡迎文末留言。
總結(jié)
以上是生活随笔為你收集整理的Spring Boot————ApplicationListener实现逃课事件监听的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法之--归并排序(好玩的一个算法o
- 下一篇: gradle idea java ssm