介绍
- 使代码之间完成解耦
- 需要在同一个Spring体系内才能实现
实现
一、自定义事件
继承ApplicationEvent,定义一个自定义事件
import org.springframework.context.ApplicationEvent;
/**
* MQTT连接准备就绪事件
*
* @author Klaus
*/
public class MqttConnectReadyEvent extends ApplicationEvent {
private Boolean forceReady;
public MqttConnectReadyEvent(Object source, Boolean forceReady) {
super(source);
this.forceReady = forceReady;
}
}
二、事件发布
实现ApplicationEventPublisherAware,获取ApplicationEventPublisher对象,实现事件发布
由于ApplicationEvent对象需要入参ApplicationContext,所以同时实现ApplicationContextAware接口,获取ApplicationContext对象
@Slf4j
public class CustomEventPublisher implements ApplicationEventPublisherAware, ApplicationContextAware {
private ApplicationEventPublisher applicationEventPublisher;
private ApplicationContext applicationContext;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 发布MQTT连接就绪事件
*
* @param forceReady 强制就绪
*/
public void publishMqttConnectReadyEvent(Boolean forceReady) {
try {
MqttConnectReadyEvent myEvent = new MqttConnectReadyEvent(applicationContext, forceReady);
applicationEventPublisher.publishEvent(myEvent);
} catch (Exception e) {
log.error("Failed to publish mqtt connect ready event", e);
}
}
}
三、事件监听
编写监听方法,入参为自定义事件对象
-
方式一:注解式监听
@Slf4j @Component public class MqttReadyEventListener { @EventListener public void listen(MqttConnectReadyEvent event) { log.info("mqtt connect ready"); } } -
方式二:编码式
@Slf4j @Component public class MqttReadyEventListener implements ApplicationListener<MqttConnectReadyEvent> { @Override public void onApplicationEvent(MqttConnectReadyEvent event) { log.info("mqtt connect success"); } }