一文读懂Guava EventBus(订阅\发布事件)
内容提要
EventBus通过SubscriberRegister缓存所有含有@Subscribe注解的方法,并将其维护在Subscribers中,publisher发布事件Event后,EventBus会从SubscriberRegister中查找出所有订阅此事件的Subscriber,然后让Dispatcher分发Event到每一个Subscriber,子类listener注册,父类listener也会注册,如果作为参数的Event有继承关系,使用EventBus发布Event时,Event父类的监听者也会对Event进行处理。EventBus有三种Dispatcher,但不支持事务、设置订阅者消费顺序、消息过滤,SpringEvent支持消息过滤,但复杂程度较高。
关键要点
-
EventBus通过SubscriberRegister缓存所有含有@Subscribe注解的方法,并维护在Subscribers中。
-
EventBus发布事件后,会从SubscriberRegister中查找所有订阅此事件的Subscriber,并由Dispatcher分发事件。
-
EventBus有三种Dispatcher,但不支持事务、设置订阅者消费顺序和消息过滤。
-
EventBus的使用分为五个部分:简述、原理解析、使用指导、注意事项和项目中遇到的问题。
-
EventBus支持同步和异步执行,EventBus是同步的,而AsyncEventBus是异步的。
-
DeadEvent用于处理没有订阅者的事件,可以帮助调试和日志记录。
-
Subscriber的唯一标识是方法名和入参,确保不会重复注册。
-
在使用@PostConstruct注解注册Listener时,子类会执行父类的注册方法,可能导致父类的订阅方法被注册多次。
-
EventBus不支持事务和消息过滤,SpringEvent支持消息过滤但复杂度较高。
-
在项目中使用EventBus时需注意事件的发布顺序和处理逻辑,以避免重复消息发送。