Spring监听事件使用

废话前言:

首先说一下我为什么使用事件,比如现在创建一个订单但是我创建成功后要给客户发送一条短信和一个邮件提醒,本身没创建订单一系列操作就需要很多时间但是我还要去发送短信和邮件,期间还要调用其它服务来实现耗时比较长达不到客户的满意度,所以使用的方式可以说一下:

1:activeMQ(异步)

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

下面我们只说第二种方式

在谈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;
}

第二:定义一个监听

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

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

第三:现在自定义事件和监听器都好了,我们就来看看第一个问题,监听器如何部署到ApplicationContext,有四种方式可以实现,我们一个一个看:

posted @ 2018-09-16 22:06  代言人  阅读(9258)  评论(0编辑  收藏  举报