Inyección de Dependencia
Sponge usa inyecciones de dependencia para proveer a los plugins de ciertas instancias de API. Las inyecciones de dependencia permiten a los plugins designar algunos tipos de API que serán inyectados después de la construcción.
Lista Temporal de Tipos Inyectados
- ConfigDir (anotación en Ruta o Archivo)
Usado para inyectar el directorio de configuración del complemento:
./Config/
O./config/<Plugin#id>/
dependiendo de ConfigDir#sharedRoot()- DefaultConfig (anotación en Path, ConfigurationLoader o File)
Se usa para inyectar el archivo de configuración específico del complemento:
<Plugin#id>.conf
- AssetId (annotation on Asset)
Used to inject a
Asset
from the asset folder of the plugin- AsynchronousExecutor (annotation on SpongeExecutorService)
Used to inject the plugin’s specific AsynchronousExecutor
- SynchronousExecutor (annotation on SpongeExecutorService)
Used to inject the plugin’s specific SynchronousExecutor
- ChannelId (annotation on ChannelBinding.IndexedMessageChannel or ChannelBinding.RawDataChannel)
Used to inject a
ChannelBinding
with the given channel id- Asset
Must be annotated with
@AssetId
.- SpongeExecutorService
Must be annotated with either
@AsynchronousExecutor
or@SynchronousExecutor
. Depending on the annotation given this will contain a reference to the plugin’s specific Asynchronous or Synchronous Executor.- ConfigurationLoader<CommentedConfigurationNode>
Debe estar anotado con
@DefaultConfig
. Se usa para inyectar unConfigurationLoader
pregenerado para elFile
de la misma anotación.- EventManager
Administra el registro de los controladores de eventos y el envío de eventos.
- Archivo
Debe anotarse con
@DefaultConfig
o@ConfigDir
. Dependiendo de la anotación dada, esto contendrá una referencia de archivo al archivo de configuración por defecto de los complementos o al directorio utilizado para almacenar los archivos de configuración. Sin embargo, la Ruta (ver a continuación) debe ser preferida.- Game
The
Game
object is the core accessor of SpongeAPI.- GameRegistry
Proporciona una manera fácil de recuperar tipos provenientes de un
Game
.- GuiceObjectMapperFactory
Una herramienta proporcionada por Configurate para permitir un mapeo más fácil de los objetos a los nodos de configuración. Ver Serializando Objetos para su uso.
- Inyector
com.google.inject.Injector
está disponible desde Guice, es el inyector que se usó para inyectar las dependencias de su plugin. Usted puede usarlo para crear un inyector hijo con su propio módulo para inyectar sus propias clases con las dependencias provistas por Sponge listadas en esta página, o configurar sus propias clases- Logger
Se usa para identificar el complemento desde el cual son enviados los mensajes registrados.
- Ruta
Debe anotarse con
@DefaultConfig
o@ConfigDir
. Dependiendo de la anotación dada, esto contendrá una referencia de ruta al archivo de configuración por defecto de los complementos o al directorio utilizado para almacenar los archivos de configuración.- PluginContainer
Un envoltorio de clase Plugin, utilizado para recuperar información de la anotación para facilitar su uso.
- PluginManager
Administra los complementos cargados por la implementación. Puede recuperar otro
PluginContainer
del complemento.
Ejemplos de Inyección
Hay algunas referencias que son difíciles de obtener -o, en algunos casos, imposibles - sin inyección. Si bien estos pueden no ser absolutamente vitales para cada complemento, se utilizan con bastante frecuencia.
Nota
Recuerde que es casi siempre la mejor práctica para inyectar sus objetos dentro de la clase principal, ya que es instanciado con el inyector Guice cuando el complemento es cargado.
Logger
Truco
Vea Registro y Depuración para obtener una guía completa, específicamente para Logger.
Juego
The Game
object is the opening for many of the internal functions of SpongeAPI, from the EventManager
to the
Server and even the Sync/Async Scheduler.
Si bien es completamente posible recuperar el objeto Game
a través de Sponge.getGame ()
, es obtenido comúnmente a través de una inyección.
Ejemplo - Campo
import com.google.inject.Inject;
import org.spongepowered.api.Game;
@Inject
private Game game;
Ejemplo - Método
private Game game;
@Inject
private void setGame(Game game) {
this.game = game;
}
Ejemplo - Constructor
Para el propósito de este tutorial, «Apple» es el nombre de la clase.
private Game game;
@Inject
public Apple(Game game) {
this.game = game;
}
Directorio de Configuración
La forma recomendada de obtener su archivo de configuración es a través de Guice, junto con la anotación ConfigDir.
Truco
Si usted configura sharedRoot
como `` true``, su ConfigDir
será el mismo directorio que -potencialmente- albergue la configuración de otros complementos. En la mayoría de los casos donde se requiere el ConfigDir
, esto debería ser falso
.
Ejemplo - Campo
import org.spongepowered.api.config.ConfigDir;
import java.nio.file.Path;
@Inject
@ConfigDir(sharedRoot = false)
private Path configDir;
Ejemplo - Método
private Path configDir;
@Inject
private void setConfigDir(@ConfigDir(sharedRoot = false) Path configDir) {
this.configDir = configDir;
}
Ejemplo - Constructor
Para los fines de este tutorial, «Orange» es el nombre de la clase.
private Path configDir;
@Inject
public Orange(@ConfigDir(sharedRoot = false) Path configDir) {
this.configDir = configDir;
}
Configuración Predeterminada
La forma en que funciona @DefaultConfig
es muy similar a @ConfigDir
. La mayor diferencia es que @DefaultConfig
se refiere a un archivo específico, mientras que @ConfigDir
se refiere a un directorio.
Truco
Vea Configurando Extensiones para obtener una guía completa, específicamente para``@DefaultConfig``.