Spring Event实现发布/订阅模式

Spring Event对发布/订阅模式进行了封装,使用起来更加简单,看看怎么来实现吧

自定义事件

  • MessageSubjectEvent:继承ApplicationEvent,并重写构造函数。ApplicationEvent是Spring提供的所有应用程序事件扩展类。
/**
 * 

* 消息通知生产者 *

* @author king * @since 2023-03-21 **/ @Slf4j public class MessageProducerEvent extends ApplicationEvent { public MessageProducerEvent(Message source) { super(source); } }
  • Message:事件消息,定义了事件的消息体。
public class Message implements Serializable {
    // 属性...

    // 方法...    

}

事件监听者

事件监听者,有两种实现方式,一种是实现ApplicationListener接口,另一种是使用@EventListener注解。

实现ApplicationListener接口

实现ApplicationListener接口,重写onApplicationEvent方法,将类定义为Bean,这样,一个监听者就完成了。

  • MessageProducerEvent 
/**
 * 

* 消息处理生成者 *

* * @author king * @since 2023-03-22 **/ @Slf4j @Component public class MessageHandlerProducer implements ApplicationListener { @Override public void onApplicationEvent(@NonNull MessageProducerEvent event) { System.out.println("event.getSource() = " + event.getSource()); System.out.println("event.getTimestamp() = " + event.getTimestamp()); log.info("[afterMessageProducer]..."); } }

使用@EventListener注解

使用@EventListener注解就更简单了,直接在方法上,加上@EventListener注解就行了。

/**
 * 

* 消息处理生成者 *

* * @author king * @since 2023-03-22 **/ @Slf4j @Component public class MessageHandlerProducer { @EventListener(value = MessageProducerEvent.class) public void onApplicationEvent(@NonNull MessageProducerEvent event) { System.out.println("event.getSource() = " + event.getSource()); System.out.println("event.getTimestamp() = " + event.getTimestamp()); log.info("[afterMessageProducer]..."); } }

测试

最后测试一下吧

/**
 * 发布订阅 test
 *
 * @author king
 * @since 2023-03-22
 **/
@SpringBootTest
public class PubsubTest {

    @Autowired
    private ApplicationEventPublisher publisher;

    Message message = Message.builder()
            .key("123")
            .msgId(11111)
            .build();

    @Test
    void testProducer(){
        System.out.println("执行业务代码...");
        publisher.publishEvent(new MessageProducerEvent(message));
    }
}
  • 执行结果

 

你可能感兴趣的:(spring,java,spring,boot)