3. Inversione di controllo IoC
Soffermiamoci ora sul concetto di inversione di controllo (IoC, Inversion of Control) utilizzato da Spring per configurare le applicazioni. Per illustrare questo concetto, torniamo all’architettura della nostra precedente applicazione di prova:
![]() |
Per accedere ai dati di SGBD, la classe di test deve utilizzare i servizi di un oggetto che implementi l’interfaccia [IArticlesDao], ad esempio un oggetto di tipo [ArticlesDaoPlainODBC]. Abbiamo esaminato due possibili soluzioni per istanziare un oggetto di questo tipo:
- nella prima soluzione, la classe di test richiedeva autonomamente l’istanziazione di un oggetto di tipo [ArticlesDaoPlainODBC]:
<TestFixture()> _
Public Class NunitTestArticlesDaoPlainOdbc
' l'oggetto da testare
Private articlesDao As IArticlesDao
<SetUp()> _
Public Sub init()
' si crea un'istanza dell'oggetto da testare
articlesDao = New ArticlesDaoPlainODBC("odbc-firebird-articles", "SYSDBA", "masterkey")
End Sub
...
End Class
Nel codice è presente una dipendenza rigida dal nome della classe. Se la classe di implementazione dell'interfaccia [IArticlesDao] dovesse cambiare, il codice del metodo [init] dovrebbe essere modificato. Esistono le seguenti relazioni tra gli oggetti:
![]() |
La classe [NunitTestArticlesDaoPlainOdbc] si occupa autonomamente della creazione dell’oggetto [ArticlesDaoPlainODBC] di cui ha bisogno. Tornando al termine «inversione di controllo», si dirà che è lei ad avere il «controllo» per creare l’oggetto di cui ha bisogno.
- La seconda soluzione procede in modo diverso. La classe di test è diventata la seguente:
<TestFixture()> _
Public Class NunitSpringTestArticlesDaoPlainOdbc
' l'oggetto da testare
Private articlesDao As IArticlesDao
<SetUp()> _
Public Sub init()
' si recupera un'istanza del generatore di oggetti Spring
Dim factory As XmlObjectFactory = New XmlObjectFactory(New FileStream("spring-config-plainodbc.xml", FileMode.Open))
' si richiede l'istanziazione dell'oggetto DAO articoli
articlesDao = CType(factory.GetObject("articlesdao"), IArticlesDao)
End Sub
...
End Class
Questo meccanismo potrebbe essere schematizzato come segue:
![]() |
In questo caso, la classe di test non prende l’iniziativa di richiedere la creazione di un oggetto [ArticlesDaoPlainODBC]. Si limita a chiedere a Spring un riferimento a tale oggetto. Se l’oggetto esiste, Spring ne restituisce un riferimento. Se non esiste, lo crea. La classe di test ha perso il controllo sulla creazione dell’oggetto [ArticlesDaoPlainODBC]. Si limita semplicemente a richiedere un riferimento a tale oggetto. In questo caso, tale richiesta costringerà Spring a creare l’oggetto. Tuttavia, in un altro contesto, si potrebbe ipotizzare che l’oggetto richiesto sia già stato creato su richiesta dell’applicazione. In tal caso, Spring non ricrea l’oggetto, ma restituisce un riferimento all’oggetto già esistente (singleton). Il concetto di Inversione di controllo (IoC) significa in questo caso:
- che l’applicazione non prende mai l’iniziativa di creare i singleton di cui ha bisogno. Si limita semplicemente a richiederne i riferimenti.
- È Spring a decidere di creare un singleton al momento della prima richiesta di riferimento ad esso


