Spring @OnApplicationEvent 典型用法

发布于:2025-06-18 ⋅ 阅读:(21) ⋅ 点赞:(0)

典型用法

监听自定义事件

// 定义事件类
public class UserRegisteredEvent extends ApplicationEvent {
    private final String username;

    public UserRegisteredEvent(Object source, String username) {
        super(source);
        this.username = username;
    }

    public String getUsername() {
        return username;
    }
}

// 发布事件
@Service
public class UserService {

    @Autowired
    private ApplicationEventPublisher eventPublisher;

    public void registerUser(String username) {
        System.out.println("用户注册:" + username);
        eventPublisher.publishEvent(new UserRegisteredEvent(this, username));
    }
}

// 监听事件
@Component
public class UserRegistrationListener {

    @OnApplicationEvent
    public void onUserRegistered(UserRegisteredEvent event) {
        System.out.println("监听到用户注册事件:" + event.getUsername());
    }
}

监听内置 Spring 应用事件

Spring 内置了一些标准事件,可以直接使用 @OnApplicationEvent 进行监听。

// 监听应用启动完成事件
@Component
public class StartupEventListener {

    @OnApplicationEvent
    public void onApplicationReady(ApplicationReadyEvent event) {
        System.out.println("应用已启动完成");
    }
}

异步处理事件(结合 @Async)

默认情况下,事件监听是同步执行的。若希望异步处理,可结合 @Async 注解。

@Component
public class AsyncEventListener {

    @OnApplicationEvent
    @Async
    public void handleUserRegistered(UserRegisteredEvent event) {
        System.out.println("【异步】收到用户注册事件:" + event.getUsername());
    }
}

条件过滤事件(SpEL 表达式)

可以使用 condition 属性进行条件判断,仅当满足条件时才执行监听方法。

@Component
public class ConditionalEventListener {

    @OnApplicationEvent(condition = "#event.username.startsWith('admin')")
    public void onAdminUserRegistered(UserRegisteredEvent event) {
        System.out.println("管理员用户注册:" + event.getUsername());
    }
}

多事件监听(泛型支持)

一个监听方法可以监听多个事件类型,只需将参数声明为它们的共同父类或接口。

@Component
public class MultiEventLogger {

    @OnApplicationEvent
    public void logEvent(ApplicationEvent event) {
        System.out.println("监听到事件:" + event.getClass().getSimpleName());
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到