ApplicationEvent和ApplicationListener学习

本文介绍了Spring框架中的ApplicationEvent和ApplicationListener。ApplicationEvent作为事件抽象类,常用于表示应用程序中的特定事件,如用户注册。而ApplicationListener接口则用于监听这些事件,当事件发生时,会自动调用onApplicationEvent()方法。通过ApplicationContext的publishEvent()方法发布事件,使得监听器能够接收到并处理事件。在示例中,UserEventListener实现了ApplicationListener接口,当UserService的registry()方法触发事件发布时,UserEventListener会接收到UserRegistrationEvent并打印用户信息。

ApplicationEvent和ApplicationListener学习

今日看项目看到了ApplicationEvent抽象类和ApplicationListener接口,之前没有使用过,因此学习了一下。

ApplicationEvent抽象类表示的是某一类事件,比如网站注册的时候,用户注册可以作为一个事件。

public class UserRegistrationEvent extends ApplicationEvent {

    private User user;

    public UserRegistrationEvent(Object source,User user) {
        super(source);
        this.user = user;
    }

    public User getUser(){
        return user;
    }
}

ApplicationEvent类的使用方法是某个类继承ApplicationEvent,然后重写构造方法。其中的Object source指的是事件最初发生于哪个对象,或者事件关联的对象,永不为空。

ApplicationListener接口用于对ApplicationEvent事件进行监听。具体使用方法是,类实现ApplicationListener接口,泛型指定要监听的事件类名,重写onApplicationEvent().

@Component
@Slf4j
public class UserEventListener implements ApplicationListener<UserRegistrationEvent> {

    @Override
    public void onApplicationEvent(UserRegistrationEvent userRegistrationEvent) {
        User user = userRegistrationEvent.getUser();
        log.info("User对象是{}",user);
    }
}

写完这两个类还只是基本工作准备完成,要让这这两个类工作,还需要通过ApplicationContext类的publishEvent(ApplicationEvent applicationEvent)方法,将事件进行发布,然后对应的事件Listener类才会监听到对应的事件,并触发onApplicationEvent()方法。

@Service
public class UserService {
    @Autowired
    private ApplicationContext applicationContext;

    public void registry(User user){
        applicationContext.publishEvent(new UserRegistrationEvent(this,user));
    }
}


方法启动
2021-11-10 22:34:08.575  INFO 11376 --- [           main] c.e.demo.listener.UserEventListener      : User对象是User(name=张三, age=23, address=北京)

运行程序,可以看到,当我调用UserService的registry(User user)方法,applicationContext就会将UserRegistrationEvent事件发布,随后UserEventListener 监听器就监听到了UserRegistrationEvent事件,并自动运行了onApplicationEvent()方法。

<think>嗯,用户问的是Java中泛型类TbApplicationEventListener实现ApplicationListener接口的含义用法。首先,我得确定自己对Java泛型事件监听机制的理解是否正确。泛型类是指类在定义时使用类型参数,这样可以在实例化时指定具体类型,增加代码的复用性类型安全。ApplicationListener是Spring框架中的一个接口,用于监听应用事件,比如上下文刷新、启动等事件。 那TbApplicationEventListener这个泛型类实现ApplicationListener接口,应该是为了处理特定类型的事件。ApplicationListener接口的泛型参数通常指定了要监听的事件类型,比如ApplicationEvent的子类。所以当泛型类实现这个接口时,可能需要将事件类型作为泛型参数传入,这样onApplicationEvent方法就可以处理特定类型的事件了。 接下来需要解释这种设计的优势。比如类型安全,避免在事件处理时进行强制类型转换,减少运行时错误。同时,这样的设计可以让一个监听器专注于处理某一类事件,提高代码的可维护性。此外,可能用户提到的TbApplicationEventListener是某个特定项目或框架中的类,比如ThingsBoard,可能用于处理他们自定义的事件类型,比如DeviceRegisteredEvent。 然后要说明具体用法,包括如何定义这个泛型类,如何指定事件类型,以及如何通过Spring注册这个监听器。可能需要示例代码来展示类定义使用的过程,比如用@Component注解让Spring自动检测并注册监听器。 还需要考虑用户可能的疑问,比如为什么要用泛型而不是直接实现接口,或者如何处理多个事件类型。这时候要强调泛型带来的类型安全性代码复用性,以及如何通过泛型参数限定事件类型,确保监听器只处理特定事件。 另外,要确保回答符合用户的需求,用户可能是在实际开发中遇到了需要自定义事件监听器的情况,或者是在阅读别人的代码时看到了这种写法,想要理解其目的。因此,回答需要结合实际应用场景,说明这种模式在Spring应用中的典型用法,比如在微服务架构中处理领域事件,或者集成第三方服务时的消息通知。 最后,生成的相关问题需要围绕泛型事件监听展开,比如类型擦除的影响、泛型接口的实现注意事项、Spring的事件机制等,帮助用户进一步深入学习相关知识点。</think>### Java泛型类实现接口的含义与用法解析 #### 1. 泛型类实现接口的核心意义 当泛型类$TbApplicationEventListener$实现$ApplicationListener$接口时,其核心目的是通过泛型参数限定事件类型,**实现类型安全的事件监听**。例如: ```java public class TbApplicationEventListener<E extends ApplicationEvent> implements ApplicationListener<E> { @Override public void onApplicationEvent(E event) { // 处理特定类型的事件 } } ``` 这种方式避免了传统实现方式中的强制类型转换: ```java // 传统方式需要类型判断强制转换 @Override public void onApplicationEvent(ApplicationEvent event) { if (event instanceof CustomEvent) { CustomEvent ce = (CustomEvent) event; // 处理逻辑 } } ``` **优势对比**: - 类型安全:编译时检查事件类型 - 代码简洁:消除冗余的类型判断 - 可维护性:明确的事件类型声明 #### 2. 具体实现方式 在ThingsBoard等实际项目中,典型实现如下: ```java public class TbApplicationEventListener<T extends ApplicationEvent> implements ApplicationListener<T> { private final Consumer<T> eventHandler; public TbApplicationEventListener(Consumer<T> eventHandler) { this.eventHandler = eventHandler; } @Override public void onApplicationEvent(T event) { eventHandler.accept(event); } } ``` **使用示例**: ```java // 注册设备注册事件监听 new TbApplicationEventListener<DeviceRegisteredEvent>(event -> { System.out.println("设备注册:" + event.getDeviceId()); }); // 注册系统告警事件监听 new TbApplicationEventListener<SystemAlarmEvent>(event -> { System.out.println("系统告警:" + event.getAlarmType()); }); ``` #### 3. Spring框架中的集成 在Spring应用中可通过以下方式注册: ```java @Configuration public class EventConfig { @Bean public ApplicationListener<ContextRefreshedEvent> contextRefreshedListener() { return new TbApplicationEventListener<>(event -> { System.out.println("上下文已刷新"); }); } } ``` 或使用组件扫描: ```java @Component public class StartupListener extends TbApplicationEventListener<ContextStartedEvent> { public StartupListener() { super(event -> { System.out.println("应用启动完成"); }); } } ``` #### 4. 应用场景分析 1. **微服务架构**:监听服务注册、配置更新等事件 2. **设备管理**:处理设备上下线、数据上报等IoT事件 3. **业务流程**:监听订单创建、支付完成等业务事件 4. **系统监控**:捕获内存警告、线程阻塞等系统事件 #### 5. 最佳实践建议 - 泛型边界限定:建议使用$<T extends BaseApplicationEvent>$ - 监听器粒度:每个监听器专注处理单一事件类型 - 异常处理:添加统一异常处理逻辑 - 异步处理:结合@Async实现异步事件处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值