依赖注入

Sponge 使用依赖注入(Dependency Injection)的方式向插件提供 API 的实例。依赖注入允许插件指定几个 API 类型在其构建后是否注入。

可用于注入类型的临时列表

ConfigDir (注解 Path 或 File)
用于注入插件的配置目录: ./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 中的许多内部函数的开端,从 EventManagerServer ,甚至是同步或异步的 Scheduler

虽然可以通过 Sponge.getGame() 获取 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;
}

示例:构造方法

作为示例,这里的类名是“Apple”。
private Game game;

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

配置目录

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

小技巧

如果你设置 sharedRoottrue ,那么你的 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;
}

示例:构造方法

作为示例,这里的类名是“Orange”。
private Path configDir;

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

默认配置文件

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

小技巧

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