Spring的事件发布机制的应用

37 阅读1分钟

介绍

  1. 使代码之间完成解耦
  2. 需要在同一个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");
        }
    }