por qué hay dos instancias de un singleton con el marco de inyección de dependencia de Google Guice

Hay 2 instancias de Singleton, ambas creadas por Google Guice, en mi aplicación.

¿Cómo es eso posible?

El enlace se realiza de la siguiente manera:

bind(Foo.class).to(FooImpl.class).in(Scopes.SINGLETON);

preguntado el 12 de junio de 12 a las 18:06

Hay muchas cosas que podrían estar pasando. ¿Está seguro de que está instalando el módulo que proporciona el enlace? ¿Cómo estás inyectando la instancia (veamos el código)? -

No puedo mostrar el código, pero el módulo de inicialización vincula miles de otras clases Singleton y no hay problema. ¡Este módulo está instalado con seguridad! -

¿Está inyectando Foo o FooImpl? -

¿Tienes más de un inyector? -

FooImpl es la implementación de la interfaz Foo. Entonces, en mi código, uso la interfaz general, pero Google Guice en realidad está inyectando la implementación.. -

1 Respuestas

El problema aquí era la declaración vinculante.

Lo arreglamos reemplazando la declaración vinculante a:

bind(FooImpl.class).in(Scopes.SINGLETON);
bind(Foo.class).to(FooImpl.class); 

Respondido el 12 de junio de 12 a las 19:06

¡Extraño! ¿Es esto realmente algo que se deriva de las definiciones de esos métodos, o es un error? - Tom Anderson

Según code.google.com/p/google-guice/wiki/Ámbitos, es la clase de origen la que está vinculada por Guice, y no el destino. Entonces, probablemente tenía en mi proyecto dos clases que eran la implementación de la interfaz. Entonces, el problema era vincular la implementación como un singleton. stackoverflow.com/questions/11002935/… - Pier-Alexandre Bouchard

Dado que "los alcances se aplican al tipo vinculado [...], no al tipo que satisface ese vínculo", creo que su declaración original está vinculada Foo como singleton, pero si hubiera otro tipo de enlace que FooImpl podría satisfacer (quizás FooImpl sí mismo, u otra interfaz que implemente), entonces eso habría evocado como segunda instancia. - Tom Anderson

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.