¿A dónde se supone que se supone la anotación @Autowired en la propiedad o en el método?
-
04-10-2019 - |
Pregunta
¿Cuál es más correcto?
¿Esto (con la anotación @AutoWired en el método)?
@Controller
public class MyController
{
private MyDao myDao;
@Autowired
public MyController(MyDao myDao)
{
this.myDao = myDao;
}
¿Esto (con la anotación @autowired en la propiedad)?
@Controller
public class MyController
{
@Autowired
private MyDao myDao;
public MyController(MyDao myDao)
{
this.myDao = myDao;
}
¿A dónde se supone que se supone la anotación de @Autowired?
Solución
De acuerdo a el javadoc para autowired, la anotación se puede utilizar en "un constructor, campo, método establecido o método de configuración". Ver la documentación completa para más detalles.
Personalmente prefiero su primera opción (inyección de constructor), porque el myDao
El campo se puede marcar como final:
@Controller
public class MyControllear {
private final MyDao myDao;
@Autowired
public MyController(MyDao myDao) {
this.myDao = myDao;
}
La inyección de constructor también le permite probar la clase en una prueba unitaria sin código que depende de la primavera.
La segunda opción estaría mejor escrita como:
@Controller
public class MyControllear {
@Autowired
private MyDao myDao;
MyController() {
}
Con la inyección de campo, Spring creará el objeto y luego actualizará los campos marcados para la inyección.
Una opción que no mencionó fue poner @Autowired
en un método de setter (inyección de setter):
@Controller
public class MyControllear {
private MyDao myDao;
MyController() {
}
@Autowired
public void setMyDao(MyDao myDao) {
this.myDao = myDao;
}
No tienes que elegir uno u otro. Puede usar la inyección de campo para algunas dependencias e inyección de constructor para otras para el mismo objeto.
Otros consejos
La anotación va con la propiedad, porque eso es lo que se está alzando; la propiedad se establecerá automáticamente. Este tutorial tiene un buen ejemplo. Este ejemplo más avanzado Muestra cómo usar calificadores para desambiguar el cableado.