欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring事件监听机制

程序员文章站 2022-05-24 20:35:40
...

1、什么是Spring事件监听机制

        Spring 的事件(Application Event)为 Bean 与 Bean 之间的消息通信提供了支持。当一个 Bean 处理完一个任务之后,希望另一个 Bean 知道并能做相应的处理,这时我们就需要让另一个 Bean 监听当前 Bean 所发送的消息。(观察者模式)

(1)事件监听机制的主要角色关系

  • 事件及事件源:对应于观察者模式中的主题。事件源发生某事件是特定事件监听器被触发的原因。
  • 事件监听器:对应于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应逻辑。
  • 事件发布器:事件监听器的容器,对外提供发布事件和增删事件监听器的接口,维护事件和事件监听器之间的映射关系,并在事件发生时负责通知相关监听器。

Spring事件监听机制

(2)Spring 事件的应用场景

         是一种常见的发布-订阅模型,主要用于消息通讯等方面的应用

 

2、Spring事件应用流程

(1)自定义事件,必须继承ApplicationEvent,实现构造方法。(消息封装推送)


public class UserEvent extends ApplicationEvent {
    private BaseBean baseBean;
 
    /**
     * 重写构造函数
     * @param source 发生事件的对象
     */
    public UserEvent(Object source, BaseBean baseBean) {
        super(source);
        this.baseBean = baseBean;
    }
 
    public BaseBean getBaseBean() {
        return baseBean;
    }
 
    public void setBaseBean(BaseBean baseBean) {
        this.baseBean = baseBean;
    }
}

(2)事件监听器,监听方法的实现可以使用注解,也可以实现接口ApplicationListener,并包含具体要触发的业务逻辑需求

//使用注解编写
@Component
public class UserBeanListener {
 
    /**
     * 监听实现方法
     * @param event 监听事件
     */
    @EventListener
    public void register(UserEvent event) {
        //引发需要执行的业务逻辑代码
        System.out.println("UserBeanListener: " + event.getBaseBean().getName());
    }
}


/**
 * 自定义监听器(继承关系定义)
 * @author sxq
 * @time 2018年8月31日 上午10:27:04
 *
 */
@Component
public class UserBeanListener implements ApplicationListener<UserEvent>{
 
    @Override
    public void onApplicationEvent(UserEvent event) {
         
        System.out.println(event.getNotify().toString());
         
        //监听事件后,处理后续事情
    }
 
}

(3)使用容器发布事件(事件源)

@Service
public class RegisterService {
 
    @Autowired
    private ApplicationContext applicationContext;
 
    public void register() {
        /*
         * 这里的UserA 和 UserB 都是BaseBean的子类
         */
        //事件源,由该业务功能的推动,触发后面的事件的封装推送--事件的发布--事件的执行
        UserA a = new UserA();
        a.setName("a");
        UserB b = new UserB();
        b.setName("b");
        //实例化事件
        UserEvent userEventA new UserEvent(this, a);
        // 发布事件  UserEvent
        applicationContext.publishEvent(userEventA);
        // 发布事件  UserEvent
        applicationContext.publishEvent(new UserEvent(this, b));
 }

总结:
1.首先事件的发布与监听是一个同步的过程,就像上面代码中先发布了UserA的事件,一定会等到UserA的事件监听器的业务逻辑执行完(即UserBeanListener的register方法执行完),再发布UserB的事件。如果想让事件的监听器实现异步处理,可以在使用@Async注解(放在UserBeanListener的register上)。

3.事件与监听器的配对是通过事件的类型与监听器方法中的参数类型确定的。