依赖注入

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

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

ConfigDir (注解 Path 或 File)

用于注入插件的配置目录: ./config/./config/<Plugin#id>/ ,取决于 ConfigDir#sharedRoot()

DefaultConfig (注解 Path 或 ConfigurationLoader 或 File)

用于注入插件的特定配置文件: <Plugin#id>.conf

:javadoc:`AssetId`(注解 Asset)

用于注入插件的资源目录(Asset)。

:javadoc:`AsynchronousExecutor`(注解 SpongeExecutorService)

用于注入插件的 AsynchronousExecutor(异步执行器)

:javadoc:`SynchronousExecutor`(注解 SpongeExecutorService)

用于注入插件的 SynchronousExecutor(同步执行器)

:javadoc:`ChannelId`(注解 ChannelBinding.IndexedMessageChannel 或 ChannelBinding.RawDataChannel)

用于注入指定频道 ID 对应的 ChannelBinding

Asset

必须有 @AssetId 注解。

SpongeExecutorService

必须有 @AsynchronousExecutor@SynchronousExecutor 两个注解中的一个,不能同时出现。这个注解决定了对应字段持有的是属于该插件的异步还是同步执行器。

ConfigurationLoader<CommentedConfigurationNode>

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

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;
}

示例——构造方法作为示例,这里的类名是“Banana”

作为示例,这里的类名是“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
private void setConfigDir(@ConfigDir(sharedRoot = false) 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 的更完整的内容。