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); } }
控制台打印