La anotación @Autowired nos proporciona control a la hora de querer inyectar nuestras dependencias o instancias que se almacenan en el contexto de Spring. Hay varias forma en las que se usa @Autowired en las que se encuentran, las propiedas, los constructores y los setters.
Vídeo explicativo
https://www.youtube.com/watch?v=D1KpLFCuhcY
Modos de inyección con @Autowired
Por tipo (by AutoDetect)
En Spring, “la inyección automática”, significa que elige “la inyección por constructor” si es un constructor predeterminado (argumento con cualquier tipo de datos), de lo contrario, utiliza “la inyección por tipo”.
Por constructor (by Constructor)
En Spring, “inyectar por constructor” es en realidad inyectar por tipo en el argumento del constructor. Significa que, si el tipo de datos de un bean es el mismo que el tipo de datos del argumento del constructor de otro bean, lo inyectará.
Por tipo (by Type)
En Spring, “la inyección por tipo” significa que, si el tipo de datos de un bean es compatible con el tipo de datos de otra propiedad de bean, lo inyectará.
Por nombre (by Name)
En Spring, “la inyecciñon por nombre” significa que, si el nombre de un bean es el mismo que el nombre de otra propiedad de bean, lo inyectará.
@Autowired en propiedades
Puede usar la anotación @Autowired en las propiedades. Los propiedades se inyectan justo después de la construcción de un bean (instancia de la clase), antes de que se invoque cualquier método de configuración. La propiedad no tiene por qué ser public.
@Controller
public class UsuarioControlador {
@Autowired
private UsuarioServicio usuarioServicio;
}
@Autowired en Setters
Puede usar la anotación @Autowired en los métodos setter. Cuando Spring encuentra una anotación @Autowired utilizada con métodos setter, intentará inyectar la dependencia por tipo (byType) en el método.
@Controller
public class UsuarioControlador {
private UsuarioServicio usuarioServicio;
@Autowired
public void setUsuarioServicio(UsuarioServicio usuarioServicio) {
this.usuarioServicio = usuarioServicio;
}
}
@Autowired en Constructores
También puede aplicar @Autowired a los constructores. Si un constructor tiene la anotación @Autowired indica que el constructor debe inyectar las dependencias al crear la instancia (bean).
@Controller
public class UsuarioControlador {
private UsuarioServicio usuarioServicio;
@Autowired
public UsuarioControlador(UsuarioServicio usuarioServicio) {
this.usuarioServicio = usuarioServicio;
}
}
required en @Autowired
Cuando se construye un bean, las dependencias de @Autowired deberían estar disponibles. De lo contrario, si Spring no puede resolver dependencia de un bean, lanzará una excepción.
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [com.programandoenjava.web.UsuarioControlador] found for dependency:
expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
Para arreglar esto, debemos pasar como parámetro a la anotación @Autowired con required=false:
@Controller
public class UsuarioControlador {
@Autowired(required = false)
private UsuarioServicio usuarioServicio;
}