Spring监听事件使用

废话前言:java

首先说一下我为何使用事件,好比如今建立一个订单可是我建立成功后要给客户发送一条短信和一个邮件提醒,自己没建立订单一系列操做就须要不少时间可是我还要去发送短信和邮件,期间还要调用其它服务来实现耗时比较长达不到客户的满意度,因此使用的方式能够说一下:spring

1:activeMQ(异步)app

2:使用spring事件监听(同步+异步)异步

下面咱们只说第二种方式async

在谈Spring的事件监听以前,让咱们先了解一下Spring容器,什么是ApplicationContext ?
它是Spring的核心,Context咱们一般解释为上下文环境,可是理解成容器会更好些。 
ApplicationContext则是应用的容器。
Spring把Bean(object)放在容器中,须要用就经过get方法取出来。
此接口提供给Spring应用配置的能力,当应用启动时,此接口的实现是只读的,可是若是该实现支持,其内容也是能够从新载入的。
ApplicationContext大概提功能以下能力:
1.获取应用组件的bean工厂方法,此能力继承自 org.springframework.beans.factory.ListableBeanFactory。
2.加载资源文件的能力,此能力继承自 org.springframework.core.io.ResourceLoader
3.发布事件到已注册的监听器,此能力继承自 ApplicationEventPublisher
4.提供国际化的消息访问,此能力继承自 MessageSource
好对ApplicationContext有必定了解以后咱们再来看看Spring提供的事件监听。
为了实现事件监听的能力Spring为咱们提供了两个顶层接口/抽象类
ApplcationEvent:是个抽象类,里面只有一个构造函数和一个长整型的timestamp。咱们自定义的Application event 须要继承这个抽象类.
ApplicationListener:是一个接口,里面只有一个方法onApplicationEvent  ,每个实现改接口的类都要本身实现这个方法。 
 
Spring的事件监听是基于标准的观察者模式的,若是在ApplicationContext部署了一个实现了ApplicationListener的bean,那么当一个ApplicationEvent发布到
ApplicationContext时,这个bean获得通知并做特定的处理。
从上面这段话咱们很容易产生两点思考:1.实现了ApplicationListener的bean如何部署到ApplicationContext  2.一个ApplicationEvent如何发布到ApplicationContext
下面咱们就经过具体的代码来看看这两个问题
废话少说,先看代码!
(同步方式,默认监听当前全部事件spring boot
第一:先自定义一个MsgEvent,它自己提供一个print()方法:
/**
* 自定义管理事件
*/
public class MessageEvent extends ApplicationEvent {
/**
* 在自定义事件的构造方法中除了第一个source参数,其余参数均可以去自定义
* 能够根据项目实际状况进行监听传参
*/
private final String message;//事件交互信息
private final String JNDI;//过滤指定监听
private final String desc;//描述可传特殊参数不知足时扩展改为MAP/Object目前没遇到太特殊的
/*
* 保存JNDI的信息
* 用来过滤具体执行的监听方法
*/
public MessageEvent(Object source,String message,String desc) {
super(source);
this.message = message;
this.JNDI = (String) source;
this.desc = desc;
}

public String getJNDI() {
return JNDI;
}

public String getMessage() {
return message;
}

public String getDesc() {
return desc;
}

第二:定义一个监听ide

/**
* 测试用自定义监听器,监听事件为MyEvent
*/
@Component
public class MyLisenter implements ApplicationListener<MyEvent> {
/**
* 对监听到的事件进行处理
* @param myEvent
*/
@Override
public void onApplicationEvent(MyEvent myEvent) {

/*
这里不作处理,只对消息进行透传打印,实际状况,
能够根据项目进行逻辑进行处理
*/
myEvent.printMsg(myEvent.getMsg());
System.out.println("监听到。。。");
}
}

第三:如今自定义事件和监听器都好了,咱们就来看看第一个问题,监听器如何部署到ApplicationContext,有四种方式能够实现,咱们一个一个看:函数

相关文章
相关标签/搜索