Quali tipi di iniezione delle dipendenze conosci?
sobes.tech AI
Risposta dell'AI
Esistono tre tipi principali:
-
Iniezione tramite campo (Field Injection): La dipendenza viene iniettata direttamente nel campo della classe tramite un'annotazione (ad esempio,
@Autowiredin 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(); } } -
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(); } } -
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.