Spring监听器的使用
可以参考下面的文章
《观察者设计模式(含jdk和spring实现的)》
- 事件
我们不仅可以使用spring给我们定义好的事件,我们自己也可以自定义一个事件,只需要继承一个spirng的事件类ApplicationEvent就可以了,想了解更详细的可以参考上面的文章。
比如下面就是一个简单的事件
public class MyContextEvent extends ApplicationEvent {
/**
* Create a new ApplicationEvent.
*
* @param source the object on which the event initially occurred (never {@code null})
*/
public MyContextEvent(Object source) {
super(source);
}
}
- 监听器
同样的我们需要一个监听器去监听这个事件,在spring中提供了两种方式去监听事件,一种是继承的方式,一种是注解的方式,这两种方式形式上不同,但底层实现是一样的,这个会放在后面分析。
- 继承的方式
我们可以通过接口ApplicationListener接口的方式实现监听,在泛型中我们可以指定需要监听的事件。
下面的监听器就监听了上面我们自定义的事件,如果出发了事件,spring就会主动去调用下面的onApplicationEvent方法,通过MyContextEvent参数我们可以拿到事件源和事件对象。
@Component
public class MyContextEventListener implements ApplicationListener<MyContextEvent> {
@Override
public void onApplicationEvent(MyContextEvent myContextEvent) {
System.out.println("事件源:"+myContextEvent.getSource());
System.out.println("触发事件");
}
}
- 注解的方式
这种方式更加简单,只需要在一个方法上加上@EventListener注解就可以了,然后在参数中指定需要监听的事件就可以了,这个方法就相当于上面的onApplicationEvent方法。
@Component
public class MyContextEventListener{
@EventListener
public void onEvent(MyContextEvent event){
System.out.println("事件源:"+event.getSource());
System.out.println("触发事件");
}
}
- 触发事件
最后就是触发事件了
@Component
public class Trigger {
// spring容器
@Autowired
ApplicationContext applicationContext;
/**
* 触发事件
*/
public void trigEvent(){
// 触发事件
applicationContext.publishEvent(new MyContextEvent(applicationContext));
}
}
自己实现事件与监听
通过上面spring的监听器的使用,我们也可以自己实现一个监听器,同样实现spring的监听功能。
- 事件
首先我们也需要像spring中的ApplicationEvent一样的事件父类,这里就定义了一个空的事件类。
public class ApplicationEvnt {
}
然后我们就可以创建一个事件类,同样是继承上面这个类。
public class AEvent extends ApplicationEvnt {
}
- 监听器
监听器我们同样需要一个接口才能统一规定标准,也为了更好的抽象,下面就是监听器的接口
public interface ApplicationListener< E extends ApplicationEvnt > {
// void onEvnts(String ... a);
void onEvnt(E e);
}
然后创建一个监听AEvent事件的监听器
public class AListener implements ApplicationListener<AEvent>{
@Override
public void onEvnt(AEvent aEvent) {
System.out.println("监听到了A事件");
}
}
- 事件管理器
我们还需要一个事件管理器,这个类在spring中也是同样存在的,负责在我们在触发事件的时候将调用监听器的方法。
在这个类中会保存所有的监听器,并且事件的触发也就由它实现的,在触发的时候就会根据事件类型回调相应的监听器方法。
//事件管理器
public class ListenerManage {
//保存所有的监听器
static