Spring Event事件通知机制

本文详细介绍了Spring的事件通知机制,包括如何通过监听器解耦代码、事件的发送与响应原理,以及如何实现异步响应事件。通过示例代码展示了自定义SimpleApplicationEventMulticaster和使用@Async注解来控制部分事件的异步处理。
摘要由CSDN通过智能技术生成
1. 背景

Spring的事件通知机制是一项很有用的功能,使用事件机制我们可以将相互耦合的代码解耦,从而方便功能的修改与添加。本文我来学习并分析一下Spring中事件的原理。

举个例子,假设有一个添加评论的方法,在评论添加成功之后需要进行修改redis缓存、给用户添加积分等等操作。当然可以在添加评论的代码后面假设这些操作,但是这样的代码违反了设计模式的多项原则:单一职责原则、迪米特法则、开闭原则。一句话说就是耦合性太大了,比如将来评论添加成功之后还需要有另外一个操作,这时候我们就需要去修改我们的添加评论代码了。

在以前的代码中,我使用观察者模式来解决这个问题。不过Spring中已经存在了一个升级版观察者模式的机制,这就是监听者模式。通过该机制我们就可以发送接收任意的事件并处理。

通过一个简单的demo来看看Spring事件通知的使用:

// 定义一个事件
public class EventDemo extends ApplicationEvent {
   
    private String message;


    public EventDemo(Object source, String message) {
   
        super(source);
        this.message = message;
    }

    public String getMessage() {
   
        return message;
    }
}

// 定义一个事件监听者
@Component
public class EventDemoListener implements ApplicationListener<EventDemo> {
   
    @Override
    public void onApplicationEvent(EventDemo event) {
   
        System.out.println("receiver " + event.getMessage());
    }
}

// 事件发布
@Component
public class EventDemoPublish {
   
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void publish(String message) {
   
        EventDemo demo = new EventDemo(this, message);
        applicationEventPublisher.publishEvent(demo);
    }
}

调用EventDemoPublish.publish方法来发布消息,EventDemoListener监听器接收到消息后对消息进行处理,打印出消息的内容:
receiver hello

2. Spring事件通知原理

首先我们跟踪publishEvent方法,这个方法在AbstractApplicationContext类中。

protected void publishEvent(Object event, @Nullable ResolvableType eventType) {
   
    Assert.notNull(event, "Event must not be null");

    // Decorate event as an ApplicationEvent if necessary
    ApplicationEvent applicationEvent;
    if (event instanceof ApplicationEvent) {
   
        // 如果event是ApplicationEvent对象
        applicationEvent = (ApplicationEvent
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值