Files
tzdwindows 7 7badbb0d8e docs: 添加 Axis Innovators Box 框架完整 API 文档
- 新增浏览器模块技术文档,涵盖 BrowserCore、BrowserWindow 等核心组件
- 添加事件系统文档,包括 EventBus、GlobalEventBus 及各类事件定义
- 创建 LanguageManager 国际化管理器详细说明文档
- 新增 Log4j2OutputStream 标准输出重定向类文档
- 添加 Main 入口类启动流程与路由机制说明
- 创建 BrowserCreationCallback 回调接口使用指南
- 完善 AxisInnovatorsBox 主类架构与崩溃诊断系统文档
2026-01-03 08:46:19 +08:00

105 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# EventBus 类技术文档
**包路径:** `com.axis.innovators.box.events.EventBus`
**主要功能:** 发布-订阅Publish-Subscribe模式的事件中心
**作者:** tzdwindows 7
---
## 1. 概述
`EventBus`**Axis Innovators Box** 框架的核心通信组件。它通过事件驱动的方式实现模块间的解耦,允许应用程序的不同部分在无需相互引用的情况下进行信息交换。
该实现采用了 **基于注解Annotation-based** 的方法,通过反射动态扫描和分发事件。它不仅支持简单的事件发布,还具备完整的对象生命周期管理(注册/注销)以及跨类层级的事件监听能力。
## 2. 核心架构设计
### 2.1 存储机制
`EventBus` 内部维护了两个关键的映射表,以保证高效的事件分发和快速的资源清理:
1. **`eventSubscribers` (Map<Class<?>, List<Subscriber>>)**:
* **用途**: 用于事件发布。
* **逻辑**: 以事件的 `Class` 类型为键,快速找到所有订阅了该事件的监听者列表。
2. **`targetSubscribers` (Map<Object, List<Subscriber>>)**:
* **用途**: 用于对象注销。
* **逻辑**: 以订阅对象实例为键,记录该对象注册的所有监听器,确保在对象销毁时能一次性清理所有相关引用,防止内存泄漏。
### 2.2 订阅者封装 (`Subscriber`)
内部类 `Subscriber` 封装了执行事件回调所需的三个要素:
* **Target**: 接收事件的对象实例。
* **Method**: 标记了 `@SubscribeEvent` 的方法对象。
* **EventType**: 该监听器关注的事件类型(方法参数类型)。
---
## 3. 关键功能详解
### 3.1 动态注册 (`register`)
当一个对象调用 `register` 时,`EventBus` 会:
1. **递归扫描**: 遍历目标对象的所有方法,包括从父类继承的方法(通过 `getSuperclass()` 向上递归)。
2. **注解验证**: 筛选出带有 `@SubscribeEvent` 注解的方法。
3. **参数检查**: 确保方法有且仅有一个参数(该参数即为监听的事件类型)。
4. **建立索引**: 将符合条件的方法封装成 `Subscriber` 并存入上述两个映射表中。
### 3.2 事件发布 (`post`)
当发布一个事件对象时:
1. **类型匹配**: 获取事件的 `Class` 类型。
2. **副本保护**: 在遍历订阅者列表前创建 `copySubs` 副本。这是为了防止在执行事件回调过程中,某个监听者尝试注销自己而引发 `ConcurrentModificationException`
3. **反射调用**: 通过 `setAccessible(true)` 强制调用(即使是私有方法),并将事件对象传入。
### 3.3 生命周期管理
* **注销 (`unregister`)**: 彻底切断事件总线对目标对象的引用,是资源清理的关键步骤。
* **熔断 (`shutdown`)**: 一旦总线关闭,所有的 `post` 操作将失效,确保在应用关闭阶段不再产生新的业务逻辑执行。
---
## 4. API 接口说明
| 方法 | 描述 |
| :--- | :--- |
| `void register(Object target)` | 扫描目标对象并注册所有合法的事件监听器。 |
| `void unregister(Object target)` | 移除该对象在总线上的所有订阅关系。 |
| `boolean post(Object event)` | 向所有订阅了该事件类型的监听者发送事件。 |
| `void shutdown()` | 关闭事件总线。 |
---
## 5. 技术亮点
* **继承支持**: 通过 `while (clazz != null)` 循环,支持在父类中定义通用的事件处理逻辑,子类只需注册即可继承该能力。
* **解耦性**: 发布者完全不知道谁在处理事件,监听者也无需知道事件由谁产生,只需关注事件本身。
* **健壮性**: 内置 `handleException` 机制,确保某个监听器执行失败时不会影响总线上其他监听器的正常运行。
---
## 6. 使用代码示例
### 定义事件
```java
public class UserLoginEvent {
public final String username;
public UserLoginEvent(String name) { this.username = name; }
}
```
### 注册监听器
```java
public class LogModule {
@SubscribeEvent
public void onUserLogin(UserLoginEvent event) {
System.out.println("用户登录: " + event.username);
}
}
// 在初始化处
EventBus bus = new EventBus();
LogModule logModule = new LogModule();
bus.register(logModule);
```
### 发布事件
```java
bus.post(new UserLoginEvent("Admin"));
```
---
*文档生成时间: 2026-01-02*