Jak działa kontener IoC?

0

Chciałbym zapytać, jak działa kontener IoC na przykładzie Springa. Zanim zacznę się wgłębiać w tutoriale, chciałbym mieć ogólny pogląd na tę rzecz.
Z tego co wiem, to kontener IoC powstał po to, by wstrzykiwanie zależności (np poprzez konstruktor) stało się łatwiejsze. Nie wiem czy dobrze się orientuje, ale pozwala on zniwelować problem łańcuchowych zależności (chaining dependencies) np new D(new C(new B(new A()))). Jest jednym z 3 wyjść aby uniknąć tych łańcuchowych zależności, koło dwóch brzydkich: singleton i serviceloader. Ma ułatwić testowanie i mockowanie obiektów.
Teraz: jak to wygląda w praktyce? W jaki sposób pozwala uniknąć tych chaining dependencies? W jaki sposób dostarcza się zależności? Prosiłbym o jakiś przykład (nie pogardzę kawałkiem kodu).

3

Najpierw prosty przykład:

@Repository
public class ClientDaoIml implements ClientDao{
    public List<Client> getAllClients(){...}
}

Jeśli teraz w kontekście springowym ustawimy sobie konfiguracje annotation-based i ustawimy żeby skanował pakiet w którym mamy taką klasę to Spring już sobie ją ogarnął. Po odpaleniu aplikacji kontener Springa sam stworzy sobie obiekt takiej klasy i będzie nim zarządzał. Jak możemy takiego obiektu użyć?

@Controller
public class MagicznyKontroler{
    @Inject
    private ClientDao clientDao;
} 

I tyle. Nic więcej. Spring automagicznie sprawi że pole clientDao zostanie zainicjalizowane moim serwisem.

Warto wspomnieć: Wstrzykiwać da sie tylko do obiektów zarządzanych przez springa -> czyli de facto tylko do innych serwisów (klas oznaczonych m.in. jako @Component, @Repository, @Service, @Controller)

Jeśli chodzi o to "jak" to się dzieje, to magii tu nie ma. Spring tworzy sobie te obiekty a potem przypisuje odpowiednie referencje ;]

0

ZTCW to pod maską kontener IoC skanuje wybraną część classpatha, refleksją sprawdza klasy w poszukiwaniu adnotacji/ konwencji/ etc, potem buduje graf zależności i w momencie wyciągania obiektu z kontenera buduje te obiekty które w tym stworzonym grafie są zależnościami wyciąganego obiektu. Potem refleksją są wywoływane settery/ konstruktory i dostajemy żądany obiekt. Dzięki budowaniu grafu kontener IoC może sobie przeanalizować kod by budować klasy w odpowiedniej kolejności. Dzięki grafowi może też znajdować cykle i wtedy rzucać wyjątkiem.

Oprócz typowego kontenera IoC który buduje graf dynamicznie jest jeszcze dostępny bardziej statyczny IoC w postaci Cake Pattern w Scali.

0

Dzięki grafowi może też znajdować cykle i wtedy rzucać wyjątkiem.

Niekoniecznie ;) Bo cykl właściwie w niczym specjalnie nie przeszkadza - Spring potrafi sobie z tym radzić za pomocą wstrzykiwania specjalnych proxy w takie miejsca. Problem pojawia sie dopiero kiedy wstrzykujesz coś co już wcześniej jest proxowane -> na przykład obiekt który ma jakieś @Transactional, wtedy dopiero się wysypie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1