ApplicationContext中事件處理是由ApplicationEvent類和ApplicationListener接口來提供的。如果一個Bean實現了ApplicationListener接口,並且已經發布到容器中去,每次ApplicationContext發布一個ApplicationEvent事件,這個Bean就會接到通知。Spring事件機制是觀察者模式的實現。
ApplicationContext中的事件處理是通過ApplicationEvent類和ApplicationListener接口來提供的, 通過ApplicationContext的publishEvent()方法發布到ApplicationListener; 在這里包含三個角色:被發布的事件,事件的監聽者和事件發布者。 事件發布者在發布事件的時候通知事件的監聽者。 spring的事件需要遵循以下流程: (1)自定義事件:繼承ApplicationEvent 當前類的作用 (2)定義事件監聽器:實現ApplicationListener (3)使用容器發布事件
代碼實現
1,容器事件
package com.example.demo.springEvent; import org.springframework.context.ApplicationEvent; /** * @Description //TODO 容器事件 * @Author GaoX * @Date 2020/6/29 16:33 */ public class MessageEvent extends ApplicationEvent { private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } public MessageEvent(Object source) { super(source); } public MessageEvent(Object source, String text) { super(source); this.text = text; } public void print(){ System.out.println("監聽器調用此方法!!!!!!!!!!!!"); } }
2,監聽器
package com.example.demo.springEvent; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; /** * @Description //TODO 監聽器 * @Author GaoX * @Date 2020/6/29 16:36 */ @Component public class MessageListener implements ApplicationListener { @Override public void onApplicationEvent(ApplicationEvent event) { //此處可以定義多個ApplicationEvent if(event instanceof MessageEvent){ MessageEvent messageEvent = (MessageEvent)event; messageEvent.print(); System.out.println(messageEvent.getSource()); System.out.println(messageEvent.getText()); } } }
3,事件發布
package com.example.demo.springEvent; import org.springframework.context.ApplicationContext; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @Description //TODO 事件發布 * @Author GaoX * @Date 2020/6/29 16:41 */ @RestController public class MessagePublishEvent { private ApplicationContext applicationContext; public MessagePublishEvent(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @GetMapping("/publishEvent") public void publishEvent(String s){ MessageEvent messageEvent = new MessageEvent("測試發送", "test="+s); applicationContext.publishEvent(messageEvent); } }
控制台打印