3. Inversion of Control IoC
Laten we nu eens stilstaan bij het begrip ‘inversion of control’ (IoC, Inversion of Control) dat Spring gebruikt om applicaties te configureren. Om dit concept te illustreren, keren we terug naar de architectuur van onze vorige testapplicatie:
![]() |
Om toegang te krijgen tot de gegevens van SGBD, moet de testklasse gebruikmaken van de diensten van een object dat de interface [IArticlesDao] implementeert, bijvoorbeeld een object van het type [ArticlesDaoPlainODBC]. We hebben twee mogelijke oplossingen onderzocht om een dergelijk object te instantiëren:
- in de eerste oplossing vroeg de testklasse zelf om het instantiëren van een object van het type [ArticlesDaoPlainODBC]:
<TestFixture()> _
Public Class NunitTestArticlesDaoPlainOdbc
' het te testen object
Private articlesDao As IArticlesDao
<SetUp()> _
Public Sub init()
' we maken een instantie van het te testen object aan
articlesDao = New ArticlesDaoPlainODBC("odbc-firebird-articles", "SYSDBA", "masterkey")
End Sub
...
End Class
Er is een harde afhankelijkheid in de code van de klassenaam. Als de implementatieklasse van de interface [IArticlesDao] zou veranderen, zou de code van de methode [init] moeten worden aangepast. Er zijn de volgende relaties tussen de objecten:
![]() |
De klasse [NunitTestArticlesDaoPlainOdbc] neemt zelf het initiatief om het object [ArticlesDaoPlainODBC] aan te maken dat zij nodig heeft. Terugkomend op de term „omkering van controle”, kunnen we zeggen dat zij de „controle” heeft om het object aan te maken dat zij nodig heeft.
- De tweede oplossing pakt het anders aan. De testklasse ziet er nu als volgt uit:
<TestFixture()> _
Public Class NunitSpringTestArticlesDaoPlainOdbc
' het te testen object
Private articlesDao As IArticlesDao
<SetUp()> _
Public Sub init()
' we halen een instantie op van de Spring-objectfabrikant
Dim factory As XmlObjectFactory = New XmlObjectFactory(New FileStream("spring-config-plainodbc.xml", FileMode.Open))
' we vragen om het instantiëren van het DAO-object ‘artikelen’
articlesDao = CType(factory.GetObject("articlesdao"), IArticlesDao)
End Sub
...
End Class
Dit mechanisme kan als volgt worden weergegeven:
![]() |
Hier neemt de testklasse niet het initiatief om de aanmaak van een object [ArticlesDaoPlainODBC] aan te vragen. Ze vraagt Spring alleen om een verwijzing naar een dergelijk object. Als het object bestaat, geeft Spring een verwijzing terug. Als het niet bestaat, maakt Spring het aan. De testklasse heeft de controle over het aanmaken van het object [ArticlesDaoPlainODBC] verloren. Ze vraagt simpelweg om een verwijzing naar dit object. Dit verzoek dwingt Spring in dit geval om het object aan te maken. Maar in een andere context is het denkbaar dat het gevraagde object al op verzoek van de applicatie is aangemaakt. Spring maakt het object dan niet opnieuw aan, maar retourneert een verwijzing naar het reeds bestaande object (singleton). Het begrip ‘Inversion of Control’ (IoC) betekent hier:
- dat de applicatie nooit zelf het initiatief neemt om de singletons aan te maken die ze nodig heeft. Ze vraagt er gewoon verwijzingen naar op.
- het is Spring dat beslist om een singleton aan te maken bij de eerste aanvraag voor een verwijzing ernaar


