2012-04-13 17 views
21

Estoy usando Spring desde hace unos meses, y pensé que la inyección de dependencia con la anotación @Autowired también requería un setter para el campo para inyectar.Inyección de dependencia de primavera @Autocableado sin setter

Por lo tanto, lo estoy usando como esto:

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

    public void setMyService(MyService injectedService) { 
     this.injectedService = injectedService; 
    } 

    ... 

}

Pero he intentado esto hoy:

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

    ... 

}

Y, oh sorpresa, sin errores de compilación, no hay errores en el inicio, la aplicación funciona perfectamente ...

Así que mi pregunta es, ¿el setter es requerido para la inyección de dependencia con la anotación @Autowired?

Estoy usando Spring 3.1.1.

+3

Parece que ha respondido a su propia pregunta. – darrengorman

Respuesta

35

No necesita un colocador con @Autowired, el valor se establece por reflexión.

Comprobar este post para obtener una explicación completa How does Spring @Autowired work

+0

¡Gracias por la respuesta rápida! – Tony

+0

No se olvide de subir la publicación vinculada;) –

+0

El campo puede ser privado y Spring Autowired funciona sin setter también. – chalimartines

3

No, si la política de seguridad de Java permite primavera para cambiar los derechos de acceso para el campo de protección paquete no es necesario un regulador.

2
package com.techighost; 

public class Test { 

    private Test2 test2; 

    public Test() { 
     System.out.println("Test constructor called"); 
    } 

    public Test2 getTest2() { 
     return test2; 
    } 
} 


package com.techighost; 

public class Test2 { 

    private int i; 

    public Test2() { 
     i=5; 
     System.out.println("test2 constructor called"); 
    } 

    public int getI() { 
     return i; 
    } 
} 


package com.techighost; 

import java.lang.reflect.Field; 

public class TestReflection { 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
     Class<?> class1 = Class.forName("com.techighost.Test"); 
     Object object = class1.newInstance(); 
     Field[] field = class1.getDeclaredFields(); 
     field[0].setAccessible(true); 
     System.out.println(field[0].getType()); 
     field[0].set(object,Class.forName(field[0].getType().getName()).newInstance()); 
     Test2 test2 = ((Test)object).getTest2(); 
     System.out.println("i="+test2.getI()); 

    } 
} 

Así es como se hace mediante el reflejo.

Cuestiones relacionadas