Inyección de dependencias en Java con @autowired

| Última modificación: 18 de septiembre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Si trabajas son Spring, debes saber que es un framework bastante popular en el basto universo Java. El @autowired es una de las anotaciones más famosas dentro de este framework y se utiliza para hacer inyección de dependencias, un proceso que permite que un objeto reciba sus dependencias de fuentes externas, en vez de crearlas por sí mismo.

El día de hoy queremos explicarte qué es @autowired dentro de Spring Framework y cómo funciona. ¡Quédate, te contamos todo!

Inyección de dependencias en Java con @autowired

¿Qué es @Autowired en Java?

El @autowired en Spring funciona como un mecanismo que nos permite hacer inyecciones de dependencias de forma automática. Esto quiere decir que Spring va a encargarse de brindar las instancias de clase que sean necesarias para que una aplicación funcione correctamente, sin que se tengan que crear objetos manualmente.

Por ejemplo, imagina una situación en la que tienes un servicio que necesita acceder a un repositorio de datos. Puedes hacer uso de @autowired para que sea Spring el que se encargue de pasarle la instancia correcta cuando sea necesario, en vez de inicializar el repositorio dentro del servicio.

Tipos de inyección de dependencias con @Autowired

Usar el autowired dentro de Java nos ofrece diferentes formas de hacer una inyección, esto va a depender de dónde se aplique la anotación. Veamos algunos tipos de inyección con @autowired:

  1. Inyección en el constructor: Este es el método más recomendado, porque permite que las dependencias sean inyectadas cuando se está creando el objeto, lo que causa que las propiedades del mismo sean inmutables:
@Controller
public class MyController {
private final MyBean myBean;
@Autowired
public MyController(MyBean myBean) {
this.myBean = myBean;
}
}
  1. Inyección en un atributo: Para este caso Spring hace la inyección de la dependencia de manera directa en el atributo. Este es uno de los modos más habituales de usar @autowired, sin embargo, no está entre las mejores prácticas y algunos programadores prefieren evitarlo porque no sigue el principio de inmutabilidad:
@Controller
public class MyController {
@Autowired
private MyBean myBean;
}
  1. Inyección en un método setter: En este enfoque es posible que la dependencia sea inyectada después de que el objeto haya sido creado. Se usa en contextos en donde se quiera poder cambiar la dependencia después de la creación del objeto:
@Controller
public class MyController {
private MyBean myBean;

@Autowired
public void setMyBean(MyBean myBean) {
this.myBean = myBean;
}
}

Inyección de dependencias con Spring Boot: un ejemplo

Autowired puede simplificar enormemente el desarrollo de aplicaciones en Spring Boot. Para entender mejor, veamos un ejemplo: supongamos que tenemos un repositorio de libros y un servicio REST en el que se exponen esos datos a través de una URL:

@Repository
public class LibroRepository {
public List<Libro> buscarTodos() {
List<Libro> lista = new ArrayList<>();
lista.add(new Libro("1", "Java", "Pedro"));
lista.add(new Libro("2", "Python", "Gema"));
return lista;
}
}

Ahora, queremos enlazar este repositorio con un servicio REST que lo exponga a los usuarios:

@RestController
public class LibroRestService {
@Autowired
private LibroRepository repositorio;

@RequestMapping("/libros")
public List<Libro> buscarTodos() {
return repositorio.buscarTodos();
}
}

Cuando ejecutamos la aplicación, el servicio REST estará disponible en /libros y mostrará un listado de libros extraídos del repositorio.

Spring @Autowired y TDD: una gran dupla

El TDD o, como también es llamado, desarrollo dirigido por pruebas, ha gando popularidad y @autowired se ha adaptado bastante bien a este paradigma. Una de las grandes ventajas al usar inyecciones por constructor es que nos facilita el proceso de creación de pruebas unitarias. Al no estar dependiendo de setters o campos inyectados de manera directa, es fácil simular dependencias con mayor simplicidad, ahorrándonos trabajo en el proceso de escribir pruebas.

Modos de inyección en Spring con @Autowired

  1. Por tipo (by Type): Spring inyecta una dependencia con base en el tipo de la clase.
  2. Por nombre (by Name): Si hay varios beans del mismo tipo, Spring buscará el nombre del bean que coincida con el nombre del atributo a inyectar.
  3. Por constructor (by Constructor): Spring inyecta las dependencias a través del constructor, si este está anotado con @Autowired.

Por ejemplo, si tienes varios beans del mismo tipo, como LibroRepository, Spring inyectará el correcto basándose en el nombre o el tipo del atributo.

¿Qué pasa si no encuentra un bean compatible?

En caso tal, Spring tendrá que lanzar una excepción en caso de que no encuentre un bean compatible con la dependencia solicitada. No obstante, se puede manejar este comportamiento al establecer la propiedad required=fakse en la anotación de @autowired:

@Autowired(required = false)
private LibroRepository repositorio;

Con esta configuración, Spring no lanzará una excepción si no encuentra una instancia compatible.

Si te has imaginado creando aplicaciones que puedas usar en tu día a día o grandes proyectos de programación, te tenemos el bootcamp que hará tus sueños realidad. Se trata del curso java para principiantes y avanzados, en donde comenzaremos desde cero con las bases e iremos escalando a temáticas más complejas. Si quieres transformar tu futuro laboral y recibir excelentes ofertas con remuneraciones adecuadas, ¡estás en el lugar indicado, inscríbete ahora y recibe grandes oportunidades!

Ramón Maldonado

Full Stack Developer y Responsable de Formación base en KeepCoding.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Java y Spring Boot

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado