Sobes.tech
Junior

Quali tipi di iniezione delle dipendenze conosci?

sobes.tech AI

Risposta dell'AI

Esistono tre tipi principali:

  1. Iniezione tramite campo (Field Injection): La dipendenza viene iniettata direttamente nel campo della classe tramite un'annotazione (ad esempio, @Autowired in Spring). È facile da usare, ma rende difficile il testing unitario e viola il principio di singola responsabilità, nascondendo le dipendenze.

    // Esempio di iniezione tramite campo
    public class MyService {
        // La dipendenza viene iniettata direttamente nel campo
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Iniezione tramite setter (Setter Injection): La dipendenza viene iniettata tramite un metodo setter pubblico. Permette che la dipendenza sia opzionale (non obbligatoria), è comodo per modificare le dipendenze durante l'esecuzione (anche se raramente usato). Non crea una dipendenza obbligatoria al momento della creazione dell'oggetto.

    // Esempio di iniezione tramite setter
    public class MyService {
        private MyRepository repository;
    
        // La dipendenza viene iniettata tramite un setter
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Iniezione tramite costruttore (Constructor Injection): La dipendenza viene iniettata tramite l'argomento del costruttore. È preferibile, poiché garantisce che la dipendenza sia obbligatoria (senza di essa, l'oggetto non può essere creato), facilita il testing unitario (passando facilmente oggetti mock) e dichiara chiaramente le esigenze della classe. Rende gli oggetti immutabili dopo la creazione se i campi sono final.

    // Esempio di iniezione tramite costruttore
    public class MyService {
        private final MyRepository repository; // Campo può essere final
    
        // La dipendenza viene iniettata tramite il costruttore
        @Autowired // Nelle versioni recenti di Spring, questa annotazione può essere omessa se c'è un solo costruttore
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Tabella comparativa:

Tipo di iniezione Obbligatorietà della dipendenza Facilità d'uso Testabilità Immutabilità
Tramite campo Opzionale (nascosto) Alta Bassa No
Tramite setter Opzionale Media Media No
Tramite costruttore Obbligatorio Media Alta Possibile

Nella maggior parte dei casi, si consiglia di utilizzare l'iniezione tramite costruttore.