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