Spring 事件机制

1.1 核心概念

1.1.1 事件(Event)

  • 事件是继承自 ApplicationEvent 的类,用于封装需要传递的信息。
  • 事件通常是自定义的,表示某种特定的动作或状态变化。
import org.springframework.context.ApplicationEvent;

public class MyCustomEvent extends ApplicationEvent {
    private final String message;

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

    public String getMessage() {
        return message;
    }
}

1.1.2 事件发布者(Publisher)

  • 使用 ApplicationEventPublisher 发布事件。
  • Spring 的任何 Bean 都可以是一个事件发布者。
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

@Component
public class MyEventPublisher {
    private final ApplicationEventPublisher publisher;

    public MyEventPublisher(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    public void publishEvent(String message) {
        MyCustomEvent event = new MyCustomEvent(this, message);
        publisher.publishEvent(event);
    }
}

1.1.3 事件监听器(Listener)

  • 使用 @EventListener 或实现 ApplicationListener 接口来监听事件。
  • 当事件被触发时,监听器会执行对应的逻辑。

基于注解的监听器:

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class MyEventListener {
    @EventListener
    public void handleMyCustomEvent(MyCustomEvent event) {
        System.out.println("Received event - " + event.getMessage());
    }
}

实现接口的监听器:

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MyEventListener implements ApplicationListener<MyCustomEvent> {
    @Override
    public void onApplicationEvent(MyCustomEvent event) {
        System.out.println("Received event - " + event.getMessage());
    }
}

1.2 事件机制流程

  • 事件发布者调用 publishEvent() 发布一个事件。
  • Spring 的事件广播器(SimpleApplicationEventMulticaster)负责将事件分发给所有符合条件的监听器。
  • 监听器接收到事件并执行对应的处理逻辑。

1.3 实际应用场景

  1. 解耦业务逻辑:比如,用户注册成功后发送欢迎邮件和日志记录,两个操作通过事件机制解耦。
  2. 应用状态变化通知:系统中某个模块状态变化时,通知其他模块执行相关处理。
  3. 异步事件处理:Spring 事件机制支持异步事件处理(通过线程池)。
@Component
public class AsyncEventListener {
    @EventListener
    @Async
    public void handleEvent(MyCustomEvent event) {
        System.out.println("Processing event asynchronously: " + event.getMessage());
    }
}

1.4 常见注意事项

  1. 默认情况下,事件监听器在同一个线程中执行,可以通过 @Async 实现异步。
  2. 自定义事件必须继承 ApplicationEvent(Spring 4.2+ 不强制要求,但推荐这样做)。
  3. 发布事件的组件需要被 Spring 容器管理。

爱跑步的猕猴桃
1 声望0 粉丝

引用和评论

0 条评论