依赖注入
Sponge 使用依赖注入(Dependency Injection)的方式向插件提供 API 的实例。依赖注入允许插件指定几个 API 类型在其构建后是否注入。
可用于注入类型的临时列表
- ConfigDir (注解 Path 或 File)
用于注入插件的配置目录:
./mods/
或./mods/<Plugin#id>/
(译者注:实测似乎应为config/
或config/<Plugin#id>/
目录),取决于 ConfigDir#sharedRoot() 。- ConfigurationLoader<CommentedConfigurationNode>
必须使用
@DefaultConfig
注解。用于注入根据拥有相同注解的File
预先生成的ConfigurationLoader
。- DefaultConfig (注解 Path 或 ConfigurationLoader 或 File)
用于注入插件的特定配置文件:
<Plugin#id>.conf
。- EventManager
管理事件的注册和触发。
- File
必须使用
@DefaultConfig
或@ConfigDir
注解。根据给定的注解注入插件的默认配置文件或配置目录。然而,我们更建议使用 Path(见下)。- Game
Game
对象是 SpongeAPI 的核心访问器。- GameRegistry
以简单的方式通过一个
Game
获取类型。- GuiceObjectMapperFactory
一个 Configurate 提供的用于更容易地建立对象和配置节点之间的映射的工具。参见 序列化对象 以获取其使用方法。
- Injector
由 Guice 提供的
com.google.inject.Injector
是用来注入插件依赖的注入器。你可以使用它创建一个具有自己的模块的子注入器,以注入您自己的类,或者此页上列出的 Sponge 提供的依赖项,或者用于配置自己的类。- Logger
用于标识插件用于发送日志消息的日志记录器。
- Path
必须使用
@DefaultConfig
或@ConfigDir
注解。根据给定的注解注入插件的默认配置文件或配置目录的路径。- PluginContainer
Plugin 类的一层包装,用于更容易地获取注解的信息。
- PluginManager
用于管理被加载的插件。你可以通过它获得另一个插件的
PluginContainer
。
依赖注入示例
有一些引用很难获得,或者在某些情况下,必须使用依赖注入。虽然这些对于每个插件来说,可能不是绝对重要的,但一般情况下插件会经常使用它们。
注解
记住 几乎总是最好 的做法是在主类中执行依赖注入,因为在插件加载时待注入的对象就已被 Guice 实例化了。
Logger
小技巧
请参阅 日志记录和调试 以了解针对 Logger 的更完整的内容。
Game
Game
对象是调用 SpongeAPI 中的许多内部函数的开端,从 EventManager
到 Server ,甚至是同步或异步的 Scheduler 。
虽然完全可以从大多数事件中获取到 Game
对象,但通过依赖注入获得往往是更常用的方式。
示例——字段
import com.google.inject.Inject;
import org.spongepowered.api.Game;
@Inject
private Game game;
示例——方法
private Game game;
@Inject
private void setGame(Game game) {
this.game = game;
}
示例——构造方法 ( 作为示例,这里的类名是“Banana” )
作为示例,这里的类名是“Apple”。
private Game game;
@Inject
public Apple(Game game) {
this.game = game;
}
配置目录
推荐的获取配置文件的方式是通过 Guice 和 ConfigDir 注解。
小技巧
如果你设置 sharedRoot
为 true
,那么你的 ConfigDir
将是同一个目录,其下(潜在地)包含有其他插件的配置文件。在大多数需要获取 ConfigDir
的情况下,这通常应该是 false
。
示例——字段
import org.spongepowered.api.config.ConfigDir;
import java.nio.file.Path;
@Inject
@ConfigDir(sharedRoot = false)
private Path configDir;
示例——方法
private Path configDir;
@Inject
@ConfigDir(sharedRoot = false)
private void setConfigDir(Path configDir) {
this.configDir = configDir;
}
示例——构造方法 ( 作为示例,这里的类名是“Banana” )
作为示例,这里的类名是“Orange”。
private Path configDir;
@Inject
public Orange(@ConfigDir(sharedRoot = false) Path configDir) {
this.configDir = configDir;
}
默认配置文件
@DefaultConfig
的工作方式和 @ ConfigDir
非常类似。很明显,最大的区别是 @DefaultConfig
指一个特定的文件,而 @ConfigDir
表示一个目录。
小技巧
请参阅 插件配置 以了解针对 @DefaultConfig
的更完整的内容。