Spring @OnApplicationEvent 典型用法
典型用法
监听自定义事件
// 定义事件类
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 {@Autowiredprivate ApplicationEventPublisher eventPublisher;public void registerUser(String username) {System.out.println("用户注册:" + username);eventPublisher.publishEvent(new UserRegisteredEvent(this, username));}
}// 监听事件
@Component
public class UserRegistrationListener {@OnApplicationEventpublic void onUserRegistered(UserRegisteredEvent event) {System.out.println("监听到用户注册事件:" + event.getUsername());}
}
监听内置 Spring 应用事件
Spring 内置了一些标准事件,可以直接使用 @OnApplicationEvent 进行监听。
// 监听应用启动完成事件
@Component
public class StartupEventListener {@OnApplicationEventpublic void onApplicationReady(ApplicationReadyEvent event) {System.out.println("应用已启动完成");}
}
异步处理事件(结合 @Async)
默认情况下,事件监听是同步执行的。若希望异步处理,可结合 @Async 注解。
@Component
public class AsyncEventListener {@OnApplicationEvent@Asyncpublic 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 {@OnApplicationEventpublic void logEvent(ApplicationEvent event) {System.out.println("监听到事件:" + event.getClass().getSimpleName());}
}