Corso di Java Spring Framework #3 | Inversion of Control vs Dependency Injection
In questo nuovo articolo parleremo di Inversion of Control e Dependency Injection, due concetti fondamentali per padroneggiare il framework Spring.
Probabilmente i termini utilizzati sono più complessi dei concetti che esprimono per cui cercheremo di fare un po' di chiarezza.
Alla base di tutto vi è il problema delle dipendenze.
Suppponiamo di avere una classe Veicolo
che al suo interno utilizza una istanza della classe Motore
.
In pratica Veicolo
avrà al suo interno un attributo di tipo Motore
e quindi normalmente si va ad istanziare proprio quest'ultima classe utilizzando il classico operatore new
.
Tutto funziona correttamente ma in questo modo abbiamo creato un forte accoppiamento tra le due classi.
Ciò rende difficile la portabilità di Veicolo
in un differente contesto senza la presenza della classe Motore
.
Ed ecco che che entra in gioco l'Inversion of Control: anziché creare le dipendenze all'interno della classe che ne ha bisogno, la loro gestione completa viene delegata a una qualche entità esterna, tipo un framework come nel caso di Spring.
Nel nostro esempio la classe Veicolo
continuerà ad aver bisogno della classe Motore
ma non dovrà più crearne un'istanza autonomamente al suo interno, bensì sarà Spring ad occuparsi di questo mediante l'Inversion of Control.
A questo punto occorre precisare che Dependency Injection ed Inversion of Control sono concetti differenti sebbene talvolta vengano considerati dei sinonimi.
In sostanza la DI è una possibile implementazione dell'altro che è in effetti un vero e proprio pattern.
Ad esempio si può adottare una diversa implementazione come il Service Locator, in cui la creazione delle dipendenze avviene sempre esternamente alla classe che ne ha bisogno, tuttavia è quest'ultima a contattare il service per richiederla.
Per tornare al nostro esempio la classe Veicolo
dovrebbe contattare il Service Locator e richiedere un'istanza della classe Motore
, quindi interagire direttamente con il servizio richiamando un qualche metodo specifico.
Nel caso della Dependency Injection è il framework che "inietta" all'interno della classe Veicolo
un'istanza di Motore
.
Naturalmente la classe che richiede una dipendenza deve specificarlo in qualche modo, generalmente mediante un'opportuna annotazione.
Vedremo in seguito che per quanto riguarda Spring si tratta di @Autowired
.
La grossa differenza con l'altra modalità è che non occorre contattare direttamente alcun servizio, ma tutto avviene in maniera automatica.
Spring offre diverse modalità di injection che analizzeremo in dettaglio in un prossimo articolo.
E' importante ribadire che in questo modo si riesce a disaccoppiare le classi favorendone il riuso, una delle qualità principali del software.