相依注入

Sponge 使用相依注入(Dependency Injection)來為插件提供 API 的實例。相依注入允許插件指定幾個將在建構後被注入的 API 型態

注入型態的臨時清單

ConfigDir(在 Path 或 File 加上 annotation)

用于注入插件的配置目录: ./mods/./mods/<Plugin#id>/ (译者注:实测似乎应为 config/config/<Plugin#id>/ 目录),取决于 ConfigDir#sharedRoot()

ConfigurationLoader<CommentedConfigurationNode>

必须使用 @DefaultConfig 注解。用于注入根据拥有相同注解的 File 预先生成的 ConfigurationLoader

DefaultConfig(在 Path、ConfigurationLoader 或 File 加上 annotation)

用于注入插件的特定配置文件: <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 中的许多内部函数的开端,从 EventManagerServer ,甚至是同步或异步的 Scheduler

虽然完全可以从大多数事件中获取到 Game 对象,但通过依赖注入获得往往是更常用的方式。

範例 - Field

import com.google.inject.Inject;
import org.spongepowered.api.Game;

@Inject
private Game game;

範例 - Method

private Game game;

@Inject
private void setGame(Game game) {
    this.game = game;
}

範例 - Constructor

作为示例,这里的类名是“Apple”。

private Game game;

@Inject
public Apple(Game game) {
    this.game = game;
}

設定資料夾

推荐的获取配置文件的方式是通过 Guice 和 ConfigDir 注解。

小訣竅

如果你设置 sharedRoottrue ,那么你的 ConfigDir 将是同一个目录,其下(潜在地)包含有其他插件的配置文件。在大多数需要获取 ConfigDir 的情况下,这通常应该是 false

範例 - Field

import org.spongepowered.api.config.ConfigDir;

import java.nio.file.Path;

@Inject
@ConfigDir(sharedRoot = false)
private Path configDir;

範例 - Method

private Path configDir;

@Inject
@ConfigDir(sharedRoot = false)
private void setConfigDir(Path configDir) {
    this.configDir = configDir;
}

範例 - Constructor

作为示例,这里的类名是“Orange”。

private Path configDir;

@Inject
public Orange(@ConfigDir(sharedRoot = false) Path configDir) {
    this.configDir = configDir;
}

預設設定

@DefaultConfig 的工作方式和 @ ConfigDir 非常类似。很明显,最大的区别是 @DefaultConfig 指一个特定的文件,而 @ConfigDir 表示一个目录。

小訣竅

请参阅 設定插件 以了解针对 @DefaultConfig 的更完整的内容。