概述
此处会针对“组件、插件、组件库” 等概念进行简单的介绍。
组件
一个代码中的 "组件" ,也可称为一个 "组件标识" ,即代表一个 接口 Component
的实现类型。
也可以将其理解为狭义的组件。
比如:
代码示例中的 FooComponent
和 BarComponentImpl
都可被称为 "组件标识" 的实现。
"组件标识"的作用是为一个或多个 插件 提供一个"身份"、向 Application
中提供序列化信息 、以及可以在多个插件间共享的一些配置。
我们来看看 Component
接口的定义:
Component
中主要定义了一个用作标识的字符串ID id: String
, 和提供序列化信息的 serializersModule: SerializersModule
。 其中,向 Application
中提供序列化信息是 Component
最基本的主要职责。
组件标识在某些情况下并不是必要的, 对于一些简单的插件实现来讲,组件标识的实现是可以省略的。 比如一个插件,即不需要一个可共享的配置实现,也没有需要提供的序列化信息,也没有任何地方需要提供 Component
属性, 那么它就可以没有对应的 组件标识 实现。
插件
插件 是可以安装在 Application
中的功能单位。 一个插件的实现就是指实现了接口 Plugin
的某个类型。
例如:
代码示例中的 MyPlugin
和 FooPluginImpl
都可被称为 "插件" 的实现。
何为功能单位 ?就是在构建 Application
的过程中,可以额外添加/修改一些信息、或执行一些逻辑。
举个例子,你可以在 Application
启动过程中注册一个事件处理器,或者保存事件调度器 EventDispatcher
并在后续(比如在异步中)推送一些事件。
我们来看看 Plugin
接口的定义:
非常简单对吧? Plugin
接口内没有任何约束,也就是说 Plugin
的实现可以非常自由。
一般来讲,一个插件可能"属于"某个 组件标识 ,但是也正如上文所说, 组件标识 并不是必要的。 实际上,这种"所属关系"更多的是一种约定 ,而并非限制。
这也是为什么 Plugin
接口的定义中实际上并没有要求有一个 Component
类型的属性。
一般情况下,为了严谨 ,可以在构建 Plugin
过程中去校验某个 Component
是否存在, 并获取到它、保存下来。但是如果你的 Plugin
实现的确就是用不到 Component
,那么就不需要理会它。
组件库
组件库, 在部分文档内容中也会被称为 组件 (一般会带个名字,比如"xxx组件"),它是一个比较宏观的说法, 通常指代一整个仓库或一整个依赖的统称。
一个仓库,其中包含了一个或多个组件和插件的实现,就可以将其统称为组件库。 而后为组件库起个名字,便可称之为xxx组件或xxx组件库。
也可以将其理解为广义的组件。
因此 "组件库" 是一个抽象的统称,并不是某个具体的代码、某个具体的接口实现。
Bot管理器
Bot管理器即指接口类型 BotManager
,它继承了 Plugin
,是 插件 的一个特殊子类型, 用来定义针对 Bot
的管理行为。
BotManager
中定义了对 Bot
的创建、寻找等功能,一般实现 BotManager
就会需要一个配套的 Bot
实现, 比如 FooBot
和 FooBotManager
。
与单纯的 Plugin
不同, Bot
是明确要求一个具体的 Component
的, 而 Bot
又是通过 BotManager
创建的,因此 BotManager
通常需要一个对应的 Component
实现, 并需要在构建的时候从 Application
中寻找、校验。
事件
"事件"即代表一个实现了接口 Event
(或其子类型) 的类型。 例如:
代码示例中的 MyEvent
和 FooEvent
都是一种事件类型。 其中,simbot标准库的 simbot-api
模块 (也就是 Event
接口所在的模块) 定义了一些基础的事件类型, 可以借助 IDE 的提示、 API文档 或前往文档章节 事件 Event 查阅。