Antes de empezar
¿Qué es y qué usaremos de Spring?
¿Java sigue siendo gratuito?
Instalación de ambiente de desarrollo: Windows
Instalación de ambiente de desarrollo: Linux Ubuntu
Instalación de ambiente de desarrollo: macOS
Introducción a Spring boot
Creando aplicaciones autocontenidas con Spring Initializr
Hola mundo con Spring Boot
Configurar Spring Boot
Crear la estructura del proyecto
Spring Data
¿Qué es JPA?
Conocer qué es Spring Data
Conectar la base de datos a nuestra aplicación
Mapear las tablas como clases
Crear Entity cuando su clave primaria es compuesta
Mapear relaciones entre clases
Usar la interface CrudRepository
Query Methods
Construyendo nuestra API
Implementar la anotación @Repository
¿Qué es el patrón Data Mapper y qué resuelve?
Orientar nuestra API al dominio con MapStruct
Orientar nuestro repositorio a términos del dominio
Inyección de dependencias
Implementar la anotación @Service
Implementar la anotación @RestController
Exponer nuestra API
Mejorando nuestra API
Controlar las respuestas HTTP
Crear el dominio de compras
Mapear el dominio de compras
Crear el repositorio de compras
Probando nuestros servicios de compras
Documentar nuestra API con Swagger
Despliegue de nuestra aplicación
Desplegar nuestra API desde la ventana de comandos
Desplegar nuestra base de datos con Heroku
Desplegar nuestra API con Heroku
Conclusiones y despedida del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
La inyección de dependencias es un principio clave en el desarrollo de software moderno que busca desacoplar las clases de las implementaciones que utilizan, promoviendo así el principio de inversión de control. Al pasar las dependencias a la clase en vez de crearlas internamente, se reduce el acoplamiento y se incrementa la flexibilidad y facilidad de mantenimiento del código.
Spring, un marco de trabajo popular para el desarrollo de aplicaciones en Java, implementa la inyección de dependencias utilizando su contenedor de inversión de control. Este contenedor toma el control de la creación y gestión de instancias de los objetos necesarios para el funcionamiento de la aplicación.
@Autowired
. Al usar esta anotación, se indica que el control de la creación de instancias será delegado al contenedor de Spring. Esto hace transparente el proceso de inyección de dependencias para el desarrollador, quien no tendrá que preocuparse por la creación manual de objetos.Un aspecto esencial al inyectar dependencias en Spring es asegurarse de que las clases o atributos que se desean inyectar sean componentes reconocidos por el framework. En otras palabras, deben ser beans de Spring.
CrudRepository
. Al extenderlo, automáticamente se marca como un componente de Spring, permitiendo así ser inyectado. Del mismo modo, si se utiliza una clase decorada con anotaciones específicas de otra biblioteca, como MapStruct, es importante verificar que el componente o su modelo sea compatible para ser gestionado por Spring.La inyección de dependencias automatizada elimina la necesidad de crear objetos manualmente, lo que puede ser propenso a errores y difícil de mantener. Al confiar en el framework de Spring para gestionar estas instancias, los desarrolladores pueden concentrarse en la lógica de negocio de sus aplicaciones, asegurando un código más limpio y eficiente.
Veamos un ejemplo de cómo se evita el error común del "null pointer exception" en Java gracias a la inyección de dependencias de Spring:
@Autowired
private ProductoRepository productoRepository;
@Autowired
private ProductoMapper productoMapper;
@Component
, @Service
, @Repository
, para que el contenedor pueda identificar y gestionar tus beans.Este principio no solo fomenta prácticas de codificación limpias, sino que también ofrece beneficios tangibles en la gestión y escalabilidad del software. Usar la inyección de dependencias de manera eficiente es clave para el desarrollo ágil y sostenible.
Aportes 35
Preguntas 14
Inyección de dependencias: pasar la dependencia a la clase que lo va a utilizar en lugar de crearla internamente dentro esa clase. Esto con el fin de no acoplar la clase a la implementación que esta utilizando.
Inversión de control: es un framework quien toma control de los objetos. En este caso Spring. El cual se encarga de crear y administrar instancias de objetos que se conocen como builds o componentes.
Entonces Spring usa la notación @Autowired para la inyección de dependencias.
Hay que corregir el video, Solid no tiene inyeccion de Dependencias tiene es Inversion de dependencias, la cual es basada en relaciones abstractas, como lo consigues usando injeccion pero no son lo mismo y Solid no lo tiene como principio.
Excelente explicacion, yo lo hacia porque un dia me dijeron que se debia hacer y ya. Me ha gustado mucho este curso.
Al agregar el @Autowired al ProductMapper me dice q ningun bean autowired se encontro en ProductMapper
Could not autowire,No beans of 'ProductMapper' type found
Me sale el siguiente error en respuestas anteriores dicen que cheque los getter y stter poir favor explicar bien sus respuestas sin utilizar lombok ya que eso no se esat usando en los videos gracias de antemano.
Si les aparece error de los atributos “productos” y “categoria” no se preocupen por ahora, en la clase “26. Implementar la anotación @RestController” Jose comparte la solución
- Single responsability
- Open-closed
- Liskov sustitution
- Interface segregation
- Dependency injection
se pone complicada la cosa xD
Hola a todos, he disfrutado mucho del curso.
Queria compartirles el error que me sucedia a mi, por si a alguien le pasa lo mismo, puede ser algo tonto, pero si a alguien le pasa lo mismo que tenga esto en cuenta, en el producMapper estamos usando el mapper de categoria, pero este mapeo no funciona si categoria no tiene getters y setters en la clase Producto, saltara un error de que no encuentra el atributo categoria.
Saludos.
A quienes les salga error con eclipse y mapstructs
lo solucioné con dos cosas:
Ahora Aplicar y Cerrar
SOLID hace referencia a la Inversion de Dependencia, que no es lo mismo (aunque si tiene que ver) con la** inyeccion de dependencia** que ofrese Spring. Por otro lado, la Inversion de control tiene que ver con el “Principio Holliwood” (no nos llames, nosotros te llamamos) y no se limita solo a la inyeccion de dependencias…para ampliar un poco simplementeo, espero que sirvan los comentarios. Muy buen curso !!
¡Incrible!, no entendía el porque aveces mi API soltaba errores y siempre tenía que ver con las anotaciones además de la inyección de dependencias. Ahora sé que es necesario que hagan parte de Spring para inyectar las dependecias.
¡Gracias!
Sobres, verifiquen bien sus mapeos para que no anden viendo qué anda mal durante horas como yo 😕
Hay que aclarar un error, en el video se dice que uno de los principios SOLID es la Inyeccion de Dependencia…el principio SOLID en cuestion es la Inversion de dependencia…hay que tener bien claros estos dos conceptos para no confundirlos y entender su significado.
No hay que confundir INVERSION DE DEPENDENCIA (que es parte de los principios SOLID) con INYECCION DE DEPENDENCIAS que es lo que hacemos con Spring. La INYECCION, puede hacerse gracias a la aplicacion de la INVERSION. Pero no son sinonimos.
Spring es un marco para Inversion of Control, lo que significa que para usarlo, tenemos que empaquetar nuestro código en clases de componentes individuales, diciéndole a Spring qué componentes se necesitan entre sí para funcionar. Spring toma las clases de componentes que definimos y las dependencias que definimos entre ellas e instancia un sistema de coincidencia de objetos Java con referencias entre sí. Esto nos libera de tener que escribir el llamado “código adhesivo” para crear instancias, conectar y administrar componentes manualmente, y nos permite, en cambio, centrarnos en escribir la llamada lógica empresarial, o código que se ocupa exclusivamente del modelo conceptual del solicitud.
Si se escoge la inyección de dependencias a nivel de constructor, entiendo que puedo o debo colocar a los atributos (aquellos que son Components de Spring) como final
:
@Repository
public class ProductRepositoryImpl implements ProductRepository {
private final ProductCrudRepository productCrudRepository;
private final ProductMapper mapper;
public ProductRepositoryImpl(ProductCrudRepository productCrudRepository, ProductMapper mapper) {
this.productCrudRepository = productCrudRepository;
this.mapper = mapper;
}
// more code
De ser así, se puede usar una facilidad de Lombok: @RequiredArgsConstructor
para que se reduzca un poco el código.
@Repository
@RequiredArgsConstructor
public class ProductRepositoryImpl implements ProductRepository {
private final ProductCrudRepository productCrudRepository;
private final ProductMapper mapper;
// more code
Al poner la inyección a nivel de campo, salio el siguiente mensaje en intellij “Field injection is not recommended”, adjunto la conclusión de un aporte en stackoverflow (https://stackoverflow.com/questions/39890849/what-exactly-is-field-injection-and-how-to-avoid-it)
Sigue sorprendiéndome lo que se puede hacer en java
Una de las explicaciones mas sencillas y faciles de entender que que he visto sobre que es la inyeccion de dependencias.
Que buena explicación Alejandro, no lo había comprendido tan bien.
¡Excelente!
Por mi parte es bueno hacer el autowired desde un contructor para que sea facil de testear
Por si no les funciona. al primera
https://stackoverflow.com/questions/67945048/how-inyect-dependency-by-interface-mapper
Más información sobre @beans
https://www.baeldung.com/spring-bean
autowired en articulosRepository
El significado de la anotación.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?