tutorial provides nfl google java dependency-injection guice

provides - java guice bind



¿Cómo enlazar una implementación a unas pocas interfaces con Google Guice? (3)

Necesito unir una clase como implementación de dos interfaces. Y debe estar enlazado en un alcance de singleton.

Qué he hecho:

bind(FirstSettings.class). to(DefaultSettings.class). in(Singleton.class); bind(SecondSettings.class). to(DefaultSettings.class). in(Singleton.class);

Pero, obviamente, conduce a la creación de dos instancias diferentes, porque están vinculadas a las diferentes claves.

Mi pregunta es ¿cómo puedo hacer eso?


La solución que he encontrado es:

bind(FirstSettings.class). to(DefaultSettings.class). in(Singleton.class); bind(SecondSettings.class). to(FirstSettings.class). in(Singleton.class);

Funciona en mi caso, porque SecondSettings extiende FirstSettings.


La wiki de Guice tiene una documentación sobre este caso de uso .

Básicamente, esto es lo que debes hacer:

// Declare that the provider of DefaultSettings is a singleton bind(DefaultSettings.class).in(Singleton.class); // Bind the providers of the interfaces FirstSettings and SecondSettings // to the provider of DefaultSettings (which is a singleton as defined above) bind(FirstSettings.class).to(DefaultSettings.class); bind(SecondSettings.class).to(DefaultSettings.class);

No es necesario especificar ninguna clase adicional: solo piense en términos de Provider y la respuesta es bastante natural.


Por lo tanto, DefaultSettings es una implementación de FirstSettings y SecondSettings , es decir:

public class DefaultSettings implements FirstSettings, SecondSettings { }

Digamos que tienes una clase EngineA y EngineB

public class EngineA { @Inject private FirstSettings settings; } public class EngineB { @Inject private SecondSettings settings; }

y le gustaría inyectar la misma implementación.

Puede declarar una interfaz DefaultSettingsInterface

public interface DefaultSettingsInterface extends FirstSettings, SecondSettings { }

y hacer que DefaultSettings implemente DefaultSettingsInterface

public class DefaultSettings implements DefaultSettingsInterface { }

Entonces la configuración puede ser:

bind(FirstSettings.class).to(DefaultSettingsInterface.class); bind(SecondSettings.class).to(DefaultSettingInterface.class); bind(DefaultSettingsInterface.class).to(DefaultSettings.class).in(Singleton.class);