Sobes.tech
Junior

¿Qué tipos de inyección de dependencias conoces?

sobes.tech AI

Respuesta de la IA

Hay tres tipos principales:

  1. Inyección de campo (Field Injection): La dependencia se inyecta directamente en el campo de la clase mediante una anotación (por ejemplo, @Autowired en Spring). Es fácil de usar, pero dificulta las pruebas unitarias y viola el principio de responsabilidad única, ocultando las dependencias.

    // Ejemplo de inyección de campo
    public class MyService {
        // La dependencia se inyecta directamente en el campo
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Inyección mediante setter (Setter Injection): La dependencia se inyecta a través de un método setter público. Permite que la dependencia sea opcional (no obligatorio establecerla), es conveniente para cambiar dependencias en tiempo de ejecución (aunque rara vez se usa). No crea una dependencia obligatoria al crear el objeto.

    // Ejemplo de inyección por setter
    public class MyService {
        private MyRepository repository;
    
        // La dependencia se inyecta mediante un setter
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Inyección mediante constructor (Constructor Injection): La dependencia se inyecta a través del argumento del constructor. Es preferible, ya que garantiza que la dependencia sea obligatoria (sin ella, no se puede crear el objeto), facilita las pruebas unitarias (fácil de pasar objetos mock) y declara claramente las necesidades de la clase. Hace que los objetos sean inmutables después de la creación si los campos son final.

    // Ejemplo de inyección por constructor
    public class MyService {
        private final MyRepository repository; // Campo puede ser final
    
        // La dependencia se inyecta mediante el constructor
        @Autowired // En versiones recientes de Spring, se puede omitir esta anotación si hay un único constructor
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Tabla comparativa:

Tipo de inyección Obligatorio de dependencia Facilidad de uso Testeabilidad Inmutabilidad
A través del campo Opcional (oculto) Alta Baja No
A través del setter Opcional Media Media No
A través del constructor Obligatorio Media Alta Posible

En la mayoría de los casos, se recomienda usar la inyección mediante constructor.