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
下一篇 Caffeine 缓存
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: