3. Inversione di controllo (IoC)
Concentriamoci ora sul concetto di Inversione di controllo (IoC) utilizzato da Spring per configurare le applicazioni. Per illustrare questo concetto, torniamo all'architettura della nostra precedente applicazione di test:
![]() |
Per accedere ai dati dal DBMS, la classe di test deve utilizzare i servizi di un oggetto che implementa 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 stessa ha richiesto l'istanziazione di un oggetto di tipo [ArticlesDaoPlainODBC]:
<TestFixture()> _
Public Class NunitTestArticlesDaoPlainOdbc
' the test object
Private articlesDao As IArticlesDao
<SetUp()> _
Public Sub init()
' create an instance of the object to be tested
articlesDao = New ArticlesDaoPlainODBC("odbc-firebird-articles", "SYSDBA", "masterkey")
End Sub
...
End Class
Nel codice è presente una dipendenza hard-coded dal nome della classe. Se la classe che implementa l'interfaccia [IArticlesDao] dovesse cambiare, sarebbe necessario modificare il codice nel metodo [init]. Tra gli oggetti esistono le seguenti relazioni:
![]() |
La classe [NunitTestArticlesDaoPlainOdbc] prende l'iniziativa di creare l'oggetto [ArticlesDaoPlainODBC] di cui ha bisogno. Tornando al termine "inversione di controllo", possiamo dire che è quella che ha il "controllo" sulla creazione dell'oggetto di cui ha bisogno.
- La seconda soluzione adotta un approccio diverso. La classe di test è diventata la seguente:
<TestFixture()> _
Public Class NunitSpringTestArticlesDaoPlainOdbc
' the test object
Private articlesDao As IArticlesDao
<SetUp()> _
Public Sub init()
' retrieve an instance of the Spring object manufacturer
Dim factory As XmlObjectFactory = New XmlObjectFactory(New FileStream("spring-config-plainodbc.xml", FileMode.Open))
' request instantiation of the articles dao object
articlesDao = CType(factory.GetObject("articlesdao"), IArticlesDao)
End Sub
...
End Class
Questo meccanismo potrebbe essere riassunto come segue:
![]() |
In questo caso, la classe di test non prende l'iniziativa di richiedere la creazione di un oggetto [ArticlesDaoPlainODBC]. Si limita semplicemente a chiedere a Spring un riferimento a tale oggetto. Se l'oggetto esiste, Spring restituisce un riferimento ad esso. Se non esiste, Spring lo crea. La classe di test ha perso il controllo sulla creazione dell'oggetto [ArticlesDaoPlainODBC]. Si limita semplicemente a richiedere un riferimento a questo oggetto. In questo caso, tale richiesta costringerà Spring a creare l'oggetto. Tuttavia, in un altro contesto, si potrebbe immaginare che l'oggetto richiesto sia già stato creato su richiesta dell'applicazione. Spring quindi non ricrea l'oggetto, ma restituisce un riferimento all'oggetto 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 che decide di creare un singleton alla prima richiesta di un riferimento ad esso


