您好,欢迎访问一九零五行业门户网

SpringBoot中ApplicationEvent和ApplicationListener怎么使用

在这个模型中,有两个重要的类,一个是事件,一个是监听。事件要继承applicationevent类,监听要实现applicationlistener接口。
一、开发applicationevent事件事件其实就是我们要发送的消息体,这个一般要根据我们的实际业务进行封装,需要什么类型的数据,就是用什么类型,需要哪些字段就添加哪些字段。我们来给一个案例。
package com.lsqingfeng.springboot.applicationevent; import lombok.getter;import lombok.setter;import org.springframework.context.applicationevent; /** * @classname: myapplicationevent * @description: 事件封装 * @author: sh.liu * @date: 2022-03-23 14:41 */@getter@setter@tostringpublic class myapplicationevent extends applicationevent { private integer age; private string name; /** * 需要重写构造方法 * @param source * @param name * @param age */ public myapplicationevent(object source, string name, integer age) { super(source); this.name = name; this.age = age; }}
二、 开发监听器监听器就相当于我们的mq的消费者,当有时间推送过来的时候,监听器的代码就可以执行。这里通过泛型来设置好我们的事件类型。
package com.lsqingfeng.springboot.applicationevent; import org.springframework.context.applicationlistener;import org.springframework.stereotype.component; /** * @classname: myapplicationeventlistener * @description:事件监听器 * @author: sh.liu * @date: 2022-03-23 14:50 */@componentpublic class myapplicationeventlistener implements applicationlistener<myapplicationevent> { @override public void onapplicationevent(myapplicationevent event) { system.out.println("收到消息:" + event); }}
三、推送事件推送事件需要使用applicationeventpublisher。这个对象在spring容器加载的时候就已经在容器中了。所以我们可以直接注入使用,也可以使用applicationcontext,因为applicationcontext本身就继承了applicationeventpublisher。 我们通过一个controller来验证一下。
package com.lsqingfeng.springboot.controller; import com.lsqingfeng.springboot.applicationevent.myapplicationevent;import com.lsqingfeng.springboot.base.result;import org.springframework.beans.factory.annotation.autowired;import org.springframework.context.applicationcontext;import org.springframework.web.bind.annotation.requestmapping;import org.springframework.web.bind.annotation.restcontroller; /** * @classname: applicationeventcontroller * @description: * @author: sh.liu * @date: 2022-03-23 15:21 */@restcontroller@requestmapping("event")public class applicationeventcontroller { @autowired private applicationcontext applicationcontext; @requestmapping("/push") public result pushevent(){ myapplicationevent myapplicationevent = new myapplicationevent(this,"zhangsan", 10); applicationcontext.publishevent(myapplicationevent); return result.success(); } @requestmapping("/push3") public result pushevent2(){ applicationcontext.publishevent("大家好"); return result.success(); }}
我们定义两个推送的方法。一个推送我们的myapplicationevent类型,还有一个方法推送一个字符串。
当我们调用第一个方法的时候,控制台可以打印出我们推送的数据信息。
调用推送字符串的时候,我们的监听器不会执行,原因是我们的拦截器里已经加了泛型myapplicationevent,也就是只会监听myapplicationevent类型的消息。其他类型的消息不会被监听到。
那如果我们把泛型去掉会有什么效果呢,我们来试试。
每次推送都会发送两条(可能有什么内部机制,不管了),但是两个都打印了,说明如果不加泛型,不管谁推,这边都能收到消息。
四、注解方式实现监听器除了上面的通过实现接口的方式开发监听器,我们还可以通过注解的方式来实现,具体代码如下。
package com.lsqingfeng.springboot.applicationevent; import org.springframework.context.event.eventlistener;import org.springframework.stereotype.component; /** * @classname: myapplicationeventlistener2 * @description: 注解实现监听器 * @author: sh.liu * @date: 2022-03-23 15:56 */@componentpublic class myapplicationeventlistener2 { @eventlistener public void onevent(myapplicationevent event){ system.out.println("收到消息2:" + event); }}
这里加入了@eventlistener 注解代表了这是一个监听器。方法名随意,方法里的参数代表监听的事件类型。
再次调用push方法:
发现两个监听器的数据都会打印。这一特点大家要注意一下。
以上就是springboot中applicationevent和applicationlistener怎么使用的详细内容。
其它类似信息

推荐信息