Spring Event对发布/订阅模式进行了封装,使用起来更加简单,看看怎么来实现吧
自定义事件
-
MessageSubjectEvent:继承ApplicationEvent,并重写构造函数。ApplicationEvent是Spring提供的所有应用程序事件扩展类。
/**
* <p>
* 消息通知生产者
* </p>
* @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
/**
* <p>
* 消息处理生成者
* </p>
*
* @author king
* @since 2023-03-22
**/
@Slf4j
@Component
public class MessageHandlerProducer implements ApplicationListener<MessageProducerEvent> {
@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注解就行了。
/**
* <p>
* 消息处理生成者
* </p>
*
* @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));
}
}
- 执行结果