java - injection - Inyección de dependencia de primavera @Autowired sin setter
inyeccion de dependencias spring autowired (3)
Estoy usando Spring desde hace unos meses por ahora, y pensé que la inyección de dependencia con la anotación @Autowired también requería un setter para que el campo se inyecte.
Por lo tanto, lo estoy usando así:
@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, no hay errores de compilación, no hay errores en el inicio, la aplicación se ejecuta perfectamente ...
Entonces, mi pregunta es, ¿se requiere el establecedor para la inyección de dependencia con la anotación @Autowired?
Estoy usando la primavera 3.1.1.
No necesita un configurador con @Autowired, el valor se establece por reflexión.
Consulte esta publicación para obtener una explicación completa. ¿Cómo funciona Spring @Autowired?
No, si la política de seguridad de Java le permite a Spring cambiar los derechos de acceso para el campo protegido del paquete, no se requiere un configurador.
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 utilizando la reflexión.