spring中的监听器的使用(注解和非注解的方式)
简介
背景
在开发工作中,会遇到一种场景,做完某一件事情以后,需要广播一些消息或者通知,告诉其他的模块进行一些事件处理,一般来说,可以一个一个发送请求去通知,但是有一种更好的方式,那就是事件监听,事件监听也是设计模式中 发布-订阅模式、观察者模式的一种实现。
观察者模式:简单的来讲就是你在做事情的时候身边有人在盯着你,当你做的某一件事情是旁边观察的人感兴趣的事情的时候,他会根据这个事情做一些其他的事,但是盯着你看的人必须要到你这里来登记,否则你无法通知到他(或者说他没有资格来盯着你做事情)。
正文
要想顺利的创建监听器,并起作用,这个过程中需要这样几个角色:
1、事件(event)可以封装和传递监听器中要处理的参数,如对象或字符串,并作为监听器中监听的目标。
2、监听器(listener)具体根据事件发生的业务处理模块,这里可以接收处理事件中封装的对象或字符串。
3、事件发布者(publisher)事件发生的触发者。
实现
首先定义一个事件,继承spring的applicationEvent
package com.itlike.util.listener;
import org.springframework.context.ApplicationEvent;
public class MyTestEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
private String msg;
public MyTestEvent(Object source, String msg) {
super(source);
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
其次定义监听器,自己定义的监听器需要实现ApplicationListener,同事泛型番薯要加上自己要监听的事件名,在重写的方法onApplicationEvent中,添加自己的处理业务
package com.itlike.util.listener;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class MyNoAnnotationListener implements ApplicationListener<MyTestEvent> {
@Override
public void onApplicationEvent(MyTestEvent event) {
System.out.println("非注解监听器:" + event.getMsg());
}
}
第三部就是发布事件,有了事件监听者,那么什么时候出发这个事件呢?每次想让监听器收到时间通知的时候,就可以调用一下事件发布操作.注入spring的ApplicationContext,通过spring的应用上下文进行时间的发布,参数就是要发布的MyTestEvent事件对象
调用publishEvent方法的时候回自动根据传入的事件类型,调用相对应的监听器
package com.itlike.util.listener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class MyTestEventPubLisher {
@Autowired
private ApplicationContext applicationContext;
// 事件发布方法
public void pushListener(String msg) {
applicationContext.publishEvent(new MyTestEvent(this, msg));
}
}
接下来,测试一下非注解方式的事件发布和事件监听,写一个测试Controller,模拟调用一下事件发布操作,
package com.itlike.web.test;
import com.itlike.util.listener.MyTestEventPubLisher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestEventListenerController {
@Autowired
private MyTestEventPubLisher publisher;
@RequestMapping(value = "/test/testPublishEvent1" )
public String testPublishEvent(){
publisher.pushListener("我来了!");
return "";
}
}
结果: 非注解监听器:我来了!
收到打印,说明已经在监听器中监听到了事件发布!
恭喜你,到目前为止,就已经了解了事件发布和监听的整个流程了。
进阶 spring的注解 实现事件监听
好處不用每次都去实现applicationLinsener,可以在一个class中定义多个方法,用@EnventListenter来做方法级别的注解
package com.itlike.util.listener;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class MyAnnotationListener {
@EventListener
public void listener1(MyTestEvent event) {
System.out.println("注解监听器1:" + event.getMsg());
}
}
结果:
注解监听器1:我来了!
非注解监听器:我来了!
转载自:https://blog.csdn.net/u012129558/article/details/78963947