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

Last modification:January 11, 2023
如果觉得我的文章对你有用,请随意赞赏