2012-04-13 21 views
12

Mi comprensión de Guice es que:Guice: implicaciones de la inyección campo

  • inyección de constructor de nivel (@Inject public class Widget(Dep one, Dep two)) implica que Guice siempre va a inyectar ese constructor cada vez que se invoca a través de un Injector; y
  • inyección a nivel de método (@Inject public void setDepOne(Dep one)) implica que Guice siempre va a inyectar este método cada vez que se llama, siempre y cuando el objeto Widget se ha creado usando el Guice Injector

Son estas dos hipótesis correcta? Si no, aclara!

Así que lo que colgué es: ¿Cuáles son las implicaciones de la inyección a nivel de campo?

@Inject private Dep one; 

¿Quiere decir esto que Guice siempre va a inyectar la propiedad cuando se crea el objeto a través del inyector Guice? En ese caso, me imagino que entra en conflicto con la inyección de nivel de constructor.

Por ejemplo, hace lo siguiente causar un conflicto/error:

public class Widget { 
    @Inject private Dep one; 

    private Dep two; 

    // Dep one already injected as a field! 
    @Inject public Widget(Dep one, Dep two) { 
     // ... 
    } 
} 

Gracias de antemano!

Respuesta

0

Sus suposiciones son correctas. Creo que en este caso particular, Guice inyectará one dos veces, una vez a través del constructor, una vez en el campo, si no otra cosa, porque no puede saber que van al mismo campo.

19

Guice siempre inyectará todos los campos, métodos y cualquier constructor anotado con @Inject. Tenga en cuenta que el constructor siempre se inyecta primero, por lo que su campo anotado realmente sobrescribirá esa inyección. Tome este ejemplo modificado:

class Widget { 
    @Inject 
    private Dep one; 

    @Inject 
    public Widget(Dep one) { 
     this.one = one; 
     System.out.println(one); 
    } 

    public void printDependency() { 
     System.out.println(one); 
    } 
} 

class Dep {} 

public class MyMain { 
    public static void main(String[] args) { 
     Injector i = Guice.createInjector(); 
     i.getInstance(Widget.class).printDependency(); 

    } 
} 

Cuando se ejecuta, esto producirá algo como esto:

[email protected] 
[email protected] 

claramente dos objetos diferentes. La primera línea es el constructor; el segundo es la inyección de campo.

No he encontrado a menudo un uso para la inyección de campo, excepto para reducir la verbosidad al escribir muestras del código de Guice. En el código de producción no es prudente porque hace que el código sea difícil de probar.

+0

Guice siempre creará una nueva instancia de cada dependencia que inyecte a menos que encuentre algún otro enlace, como singleton. – logan

+0

¿Puedes explicar por qué no es bueno para las pruebas? – suitianshi

+0

En este caso, los campos inyectados son privados, lo que dificulta su acceso sin usar algo parecido a la reflexión. –

Cuestiones relacionadas