Inyección de dependencias en Java
Consiste en pasar la dependencia en la clase que lo va a utilizar en lugar de crearla internamente dentro de 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.
Por lo tanto en Spring cuando estamos usando nuestras interfaces en el repositorio correspondiente es necesario asignarles la notación que te mencioné: @Auatowired, de esta manera le damos el control para que cree esas instancias:
@Autowired
private ProductoCrudRepository productoCrudRepository;
@Autowired
private ProductMapper mapper;
Asi nos evitamos crear objetos manualmente ya que es una mala práctica y estaríamos violando el principio de inyección de dependencias, si no sabes porque no es una buena práctica aqui te lo explico:
Forma incorrecta:
Forma incorrecta:
public class ProductoRepository { // Creando instancias manualmente - MAL private ProductoCrudRepository repository = new ProductoCrudRepository(); private ProductMapper mapper = new ProductMapper(); }
Forma correcta (siguiendo DI):
@Repository public class ProductoRepository { // Spring se encarga de la inyección - BIEN private final ProductoCrudRepository repository; private final ProductMapper mapper; // Constructor injection (incluso mejor que @Autowired) public ProductoRepository(ProductoCrudRepository repository, ProductMapper mapper) { this.repository = repository; this.mapper = mapper; } }
Otra forma correcta y práctica:
@Autowired
private ProductoCrudRepository productoCrudRepository;
@Autowired
private ProductMapper mapper;
¿Por qué la primera forma viola el principio de DI?
- Alta acoplamiento: La clase está creando sus propias dependencias
- Difícil de testear: No podemos inyectar mocks fácilmente
- Control directo: La clase controla la creación de sus dependencias en lugar de recibirlas
¿Por qué la segunda forma es mejor?
- Bajo acoplamiento: La clase no sabe cómo se crean sus dependencias
- Fácil de testear: Podemos inyectar mocks para pruebas
- Inversión de Control: Spring controla la creación y ciclo de vida de las dependencias
Comentarios
Publicar un comentario