插件 Plugin
插件 是 simbot-api
对外公开的接口类型 Plugin
, 它的定义如下:
public interface Plugin
是的, Plugin
接口的定义没有任何约束, 因此 Plugin
可以由实现者自由定义。
使用插件
插件用于构建 Application
的过程中, 注册后根据 Application
对其工厂所提供的各种信息来实现其功能。
首先假设我们有如下这样的一个 Plugin
实现:
class FooPlugin : Plugin {
companion object Factory : PluginFactory<FooPlugin, Unit> {
override val key: PluginFactory.Key = object : PluginFactory.Key {}
override fun create(context: PluginConfigureContext, configurer: ConfigurerFunction<Unit>): FooPlugin {
return FooPlugin()
}
}
}
安装
接下来我们要在 Application
中 安装(install
) 这个假设出来的 FooPlugin
:
launchSimpleApplication {
install(FooPlugin)
}
Applications.launchApplicationAsync(Simple.INSTANCE, configurer -> {
configurer.install(FooPlugin.Factory);
});
Applications.launchApplicationBlocking(Simple.INSTANCE, configurer -> {
configurer.install(FooPlugin.Factory);
});
配置
假如 FooPlugin
有可配置的信息的话, 也可以使用 DSL/Lambda 对其进行配置:
launchSimpleApplication {
install(FooPlugin) {
// 配置...
}
}
Applications.launchApplicationAsync(Simple.INSTANCE, configurer -> {
configurer.install(FooPlugin.Factory, conf -> {
// 配置...
});
});
Applications.launchApplicationBlocking(Simple.INSTANCE, configurer -> {
configurer.install(FooPlugin.Factory, conf -> {
// 配置...
});
});
事后获取
当我们注册完成、并启动了一个 Application
之后, 如果想要获取注册过的组件, 则可以在 Application
中找到它们:
val app = launchSimpleApplication {
install(FooPlugin)
}
app.plugins.forEach { plugin ->
// 所有注册了的插件
}
Applications.launchApplicationAsync(Simple.INSTANCE, configurer -> {
configurer.install(FooPlugin.Factory);
}).asFuture().thenAccept(app -> {
for (var component : app.getPlugins()) {
// 所有注册了的插件...
}
});
var app = Applications.launchApplicationBlocking(Simple.INSTANCE, configurer -> {
configurer.install(FooPlugin.Factory);
});
for (var plugin : app.getPlugins()) {
// 所有注册了的插件...
}
Last modified: 15 November 2024