当前位置 : 首页 » 文章分类 :  开发  »  Spring-Event

Spring-Event

Spring 事件

ApplicationContext 事件机制是观察者设计模式的实现,通过 ApplicationEvent 类和 ApplicationListener 接口,可以实现 ApplicationContext 事件处理;


ApplicationEvent 定义事件

package org.springframework.context;

import java.util.EventObject;

public abstract class ApplicationEvent extends EventObject {
    private static final long serialVersionUID = 7099057708183571937L;

    private final long timestamp;

    public ApplicationEvent(Object source) {
        super(source);
        this.timestamp = System.currentTimeMillis();
    }

    public final long getTimestamp() {
        return this.timestamp;
    }
}

Spring内置事件

Spring中ApplicationListener的使用
https://www.cnblogs.com/lwcode6/p/12072202.html


定义接收方

ApplicationListener 方式

package org.springframework.context;

import java.util.EventListener;

@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    void onApplicationEvent(E event);
}

实现 ApplicationListener 接口的 onApplicationEvent 方法

@Component
public class MyListener implements ApplicationListener<ContextRefreshedEvent> {
  
    public void onApplicationEvent(ContextRefreshedEvent event) {
        ...
    }
}

onApplicationEvent 重复收到消息/被调用2次

问题:
同一条消息 onApplicationEvent 中收到2次

排查:
SimpleApplicationEventMulticaster 的 multicastEvent 中打断点,可以看到 getApplicationListeners(event, type) 返回的 listener 列表里,listener bean 出现了2次。

原因:
实现 ApplicationListener 接口的是个 抽象类,有两个具体实现类,所以注册了重复的 listener

Event Listeners in spring is called twice
https://stackoverflow.com/questions/21852474/event-listeners-in-spring-is-called-twice

@EventListener 方式

Better application events in Spring Framework 4.2
https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2

在任意

@Component
public class MyListener {
    @EventListener
    public void handleContextRefresh(ContextRefreshedEvent event) {
        ...
    }
}

ApplicationEventPublisher 定义发送方

package org.springframework.context;

@FunctionalInterface
public interface ApplicationEventPublisher {
    default void publishEvent(ApplicationEvent event) {
        publishEvent((Object) event);
    }

    void publishEvent(Object event);
}

publishEvent(ApplicationEvent event)

利用 ApplicationContext 的 publishEvent() 方法,可以支持基于 Observer 模式的事件传播机制。

Spring中ApplicationContextAware使用说明
https://my.oschina.net/u/1407116/blog/276656


上一篇 sysbench-数据库基准测试工具

下一篇 Caffeine 缓存

阅读
评论
378
阅读预计1分钟
创建日期 2021-06-16
修改日期 2022-12-28
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论