Wstrzykiwanie zależności

Sponge uses dependency injection to provide instances of the API to plugins. Dependency injection allows plugins to designate a few API types that will be injected after construction.

Tymczasowa lista wstrzykniętych typów

ConfigDir (annotation on Path or File)
Used to inject the plugin’s configuration directory: ./mods/ OR ./mods/<Plugin#id>/ depending on ConfigDir#sharedRoot()
ConfigurationLoader<CommentedConfigurationNode>
Must be annotated with @DefaultConfig. Used to inject a pre-generated ConfigurationLoader for the File of the same annotation.
DefaultConfig (annotation on Path, ConfigurationLoader or File)
Used to inject the plugin’s specific configuration file: <Plugin#id>.conf
EventManager
Zarządza rejestracją obsługi zdarzeń i wysyłaniem zdarzeń.
Plik
Must be annotated with either @DefaultConfig or @ConfigDir. Depending on the annotation given this will contain a file reference to the plugins default config file or the directory used for storing configuration files. However, Path (see below) should be preferred.
Game
The Game object is the core accessor of the SpongeAPI.
GameRegistry
Provides an easy way to retrieve types from a Game.
GuiceObjectMapperFactory
A tool provided by Configurate to allow easier mapping of objects to configuration nodes. See Serializing Objects for usage.
Wstrzykiwacz
com.google.inject.Injector is available from Guice, it is the injector that was used to inject your plugin’s dependencies. You can use it to create a child injector with your own module in order to inject your own classes with either the Sponge provided dependencies listed on this page, or configure your own classes
Rejestrator
Used to identify the plugin from which logged messages are sent.
Ścieżka
Must be annotated with either @DefaultConfig or @ConfigDir. Depending on the annotation given this will contain a path reference to the plugins default config file or the directory used for storing configuration files.
PluginContainer
A Plugin class wrapper, used to retrieve information from the annotation for easier use.
PluginManager
Manages the plugins loaded by the implementation. Can retrieve another plugin’s PluginContainer.

Przykłady iniekcji

There are a few references which are difficult to get - or, in some cases, impossible - without injection. While these may not be absolutely vital to every plugin, they’re quite frequently used.

Informacja

Remember that it’s almost always best practice to inject your objects within the main class, as it’s instantiated with the Guice injector when the plugin is loaded.

Rejestrator

Wskazówka

View Logowanie i Debugowanie for a complete guide, specifically for the Logger.

Gra

The Game object is the opening for many of the internal functions of the SpongeAPI, from the EventManager to the Server and even the Sync/Async Scheduler.

It’s entirely possible to receive the Game object from within most events, however it is commonly obtained through an injection.

Example - Field

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

@Inject
private Game game;

** Przykład - metoda **

private Game game;

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

Example - Constructor

For the purpose of this tutorial, „Apple” is the class name.
private Game game;

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

Katalog Config

The recommended way to obtain your config file is through Guice, along with the ConfigDir annotation.

Wskazówka

If you set sharedRoot to true, your ConfigDir will be the same directory which - potentially - houses the configuration for other plugins. In most cases where grabbing the ConfigDir is required, this should be false.

Example - Field

import org.spongepowered.api.config.ConfigDir;

import java.nio.file.Path;

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

** Przykład - metoda **

private Path configDir;

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

Example - Constructor

For the purposes of this tutorial, „Orange” is the class name.
private Path configDir;

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

DefaultConfig

The way that @DefaultConfig works is very similar to @ConfigDir. The biggest difference obviously being that @DefaultConfig refers to a specific file, where @ConfigDir refers to a directory.

Wskazówka

View Konfiguracja Pluginów for a complete guide, specifically for @DefaultConfig.