3. Odwrócenie kontroli IoC
Zastanówmy się teraz nad pojęciem odwrócenia kontroli (IoC, Inversion of Control), wykorzystywanym przez Spring do konfiguracji aplikacji. Aby zilustrować tę koncepcję, wróćmy do architektury naszej poprzedniej aplikacji testowej:
![]() |
Aby uzyskać dostęp do danych obiektu SGBD, klasa testowa musi korzystać z usług obiektu implementującego interfejs [IArticlesDao], na przykład obiektu typu [ArticlesDaoPlainODBC]. Przeanalizowaliśmy dwa możliwe rozwiązania dotyczące instancjonowania takiego obiektu:
- w pierwszym rozwiązaniu sama klasa testowa żądała utworzenia instancji obiektu typu [ArticlesDaoPlainODBC]:
<TestFixture()> _
Public Class NunitTestArticlesDaoPlainOdbc
' obiekt do testowania
Private articlesDao As IArticlesDao
<SetUp()> _
Public Sub init()
' tworzymy instancję obiektu testowego
articlesDao = New ArticlesDaoPlainODBC("odbc-firebird-articles", "SYSDBA", "masterkey")
End Sub
...
End Class
W kodzie występuje twarda zależność od nazwy klasy. Gdyby zmieniła się klasa implementująca interfejs [IArticlesDao], należałoby zmodyfikować kod metody [init]. Pomiędzy obiektami występują następujące relacje:
![]() |
Klasa [NunitTestArticlesDaoPlainOdbc] sama inicjuje utworzenie obiektu [ArticlesDaoPlainODBC], którego potrzebuje. Wracając do terminu „odwrócenie kontroli”, można powiedzieć, że to ona ma „kontrolę” nad utworzeniem obiektu, którego potrzebuje.
- Drugie rozwiązanie działa inaczej. Klasa testowa wygląda teraz następująco:
<TestFixture()> _
Public Class NunitSpringTestArticlesDaoPlainOdbc
' obiekt testowy
Private articlesDao As IArticlesDao
<SetUp()> _
Public Sub init()
' pobieramy instancję generatora obiektów Spring
Dim factory As XmlObjectFactory = New XmlObjectFactory(New FileStream("spring-config-plainodbc.xml", FileMode.Open))
' żądamy instancjonowania obiektu DAO artykułów
articlesDao = CType(factory.GetObject("articlesdao"), IArticlesDao)
End Sub
...
End Class
Mechanizm ten można przedstawić w następujący sposób:
![]() |
W tym przypadku klasa testowa nie podejmuje inicjatywy, by zażądać utworzenia obiektu [ArticlesDaoPlainODBC]. Ogranicza się jedynie do zwrócenia się do Springa o odwołanie do takiego obiektu. Jeśli obiekt istnieje, Spring zwraca odwołanie do niego. Jeśli nie istnieje, tworzy go. Klasa testowa straciła kontrolę nad tworzeniem obiektu [ArticlesDaoPlainODBC]. Po prostu żąda odwołania do tego obiektu. Żądanie to zmusi tutaj Spring do utworzenia obiektu. Można jednak sobie wyobrazić, że w innym kontekście żądany obiekt został już utworzony na żądanie aplikacji. W takim przypadku Spring nie tworzy obiektu ponownie, lecz zwraca odwołanie do już istniejącego obiektu (singleton). Pojęcie odwrócenia kontroli (IoC) oznacza tutaj, że:
- że aplikacja nigdy nie podejmuje inicjatywy tworzenia singletonów, których potrzebuje. Po prostu żąda do nich odwołań.
- to Spring podejmuje decyzję o utworzeniu singletonu przy pierwszym żądaniu odniesienia do niego


