Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wstęp do kontenerów IoC

Podobne prezentacje


Prezentacja na temat: "Wstęp do kontenerów IoC"— Zapis prezentacji:

1 Wstęp do kontenerów IoC
Pico Wstęp do kontenerów IoC

2 Plan prezentacji Wzorzec Inversion of Control (IoC)
Wyszukiwanie zależności (Dependency Injection) PicoContainer Case Study Podsumowanie © Michał Małecki 2004

3 Inversion of Control Wzorzec projektowy określający architekturę kontenerów komponentów Komponenty to klasy, zawierające konkretną funkcjonalność Kontener tworzy instancje komponentów, zapewnia im niezbędne usługi, zarządza ich cyklem życia Jakarta Avalon 1998r. Stefano Mazzocchi A jak to wyglądało w Struts?? Czy kontener servletów nie jest IoC?? © Michał Małecki 2004

4 Inversion of Control Kontener IoC Komponent Wymagana usługa
Komponenty znajdują się w środowisku kontenera, który tworzy je i udostępnia niezbędne usługi, które z kolei są zapewniane przez inne komponenty. Zależności nie powinny być cykliczne (więcej o tym, później) Wymagana usługa © Michał Małecki 2004

5 Zalety IoC Automatyczne zarządzanie cyklem życia komponentów
Automatyczne rozwiązywanie zależności pomiędzy komponentami Bezbolesne testowanie komponentów Powiązanie interfejsów, a nie konkretnych implementacji © Michał Małecki 2004

6 Wyszukiwanie zależności
Komponenty wymagają usług, oferowanych przez inne komponenty Rodzaje wyszukiwania Dependency lookup Contructor Injection Setter injection © Michał Małecki 2004

7 Dependency lookup Jakarta Avalon
Każdy komponent musi implementować interfejs, którego metoda jest wykorzystywana do inicjowania Wada – komponent może istnieć jedynie wewnątrz danego kontenera Pull approach (registry concept) Examples : EJB that leverages JNDI Servlets that leverage JNDI - Contextualized Dependency Lookup (former type 1) AKA Push approach Examples : Servlets that leverage ServletContext Avalon JContainer's DNA OSGi (to be confirmed) Keel (uses Avalon) © Michał Małecki 2004

8 Dependency lookup - przykład
class Komponent implements Service { public void service(ServiceManager sm) throws ServiceException { dependency = (Depend1) sm.lookup("idZależności"); } } © Michał Małecki 2004

9 Contructor Injection Pico
Komponenty (klasy) określają swoje zależności za pomocą parametrów konstruktora Komponenty spełniają wzorzec „Dobrego Obywatela” (są w stanie spójnym w momencie utworzenia) Uniemożliwiają wykorzystanie cyklicznych zależności Utrudniony „auto-wire” w porównaniu do setter injection Jako przykłady podaję kontenery najsilniej związane z danym typem; zarówno pico obsługuje setter, jak i spring construction Auto-wire – automatyczne wyszukanie zależności, na podstawie typów bądź nazw komponentów; constructor pozwala wykorzystywać tylko typy, bo refleksja nie pozwala na odczytanie nazw parametrów © Michał Małecki 2004

10 Contructor Injection - przykład
class Komponent { public Komponent(Depend1 d){ dependency =d; } } © Michał Małecki 2004

11 Setter injection Spring
Zależności są określone przez metody setter, zgodne z JavaBean Pozwala na cykliczność zależności © Michał Małecki 2004

12 Setter injection - przykład
class Komponent { public Komponent(){ //bezparametrowy konstruktor JavaBean } public void setDependency(Depend1 d){ dependency = d; } © Michał Małecki 2004

13 Pico I was expecting a paradigm shift and all I got was a lousy constructor! © Michał Małecki 2004

14 Pico „Czysty” kontener IoC (<50kB jar) Brak wbudowanych usług
rozwinięciem jest Nano, integrujący się m.in. z Hibernate, Struts Konfiguracja za pomocą api Nano - Groovy, Javascript, Beanshell oraz XML © Michał Małecki 2004

15 org.picocontainer Interfejsy i wyjątki – uniezależnienie się od konkretnej implementacji Picocontainer – dostęp do zarejestrowanych komponentów MutablePicoContainer – zarządzanie komponentami (rejestrowanie, usuwanie) ComponentAdapter - obsługa pojedynczej instancji komponentu © Michał Małecki 2004

16 Rejestrowanie komponentów
Każdy komponent jest unikalnie identyfikowany przez identyfikator (obiekt bądź klasę) Komponent swoim identyfikatorem pico.registerComponentImplementation(Resource.class); Komponent & identyfikator pico.registerComponentImplementation("UDP", UDPCom.class); Komponent&identyfikator&lista parametrów pico.registerComponentImplementation("messenger", Messenger.class, new Parameter[] { new ComponentParameter("UDP"), new ConstantParameter("bar") }); © Michał Małecki 2004

17 Rejestrowanie komponentów
Adapter – precyzyjnie określamy sposób tworzenia i obsługi komponentów pico.registerComponent( new SetterInjectionComponentAdapter( „id", ThreadWorker.class, new Parameter[] { new ComponentParameter("Manager") })); Obiekt – gdy pico nie zarządza danym komponentem pico.registerComponentInstance(notManagableComponent); © Michał Małecki 2004

18 Usługi Pico Najważniejszym elementem Pico, umożliwiającym rozszerzenia są Adaptery Nowe implementacje interfejsów PicoContainer i MutablePicoContainer Niestety znacznie uboższe w porównaniu do Spring © Michał Małecki 2004

19 Case study Kontener danych (moduł Systemu Zarządzania Danymi):
cztery rodzaje, różniące się sposobem przechowywania (pliki, taśmy, bd) wiele konfiguracji Aplikacja opracowana w Poznańskim Centrum Superkomputerowo-Sieciowym Cześć projektu PROGRESS -http://progress.psnc.pl © Michał Małecki 2004

20 Case study - elementy Elementy: Komunikacja sieciowa
SOAP Obsługa nośników trwałych XML, Berkeley Kontrola zajętości File.renameTo, fuser Zadania cykliczne (wątki) © Michał Małecki 2004

21 Case study – podejście 1 Jedna klasa główna + 2 wątki
Absolutnie nietestowalne Nieczytelne Możliwość dodania nowego rodzaju kontenera przez CnP CnP – copy’n’Paste © Michał Małecki 2004

22 Case study – podejście 2 Rozbicie funkcjonalności na zbiór klas (komponenty bez kontenera) Znaczne poprawienie parametrów, rozszerzalności Wybór implementacji poszczególnych komponentów jest rozproszony po całej aplikacji Nadal problemy z testami jednostkowymi © Michał Małecki 2004

23 Case study – podejście 3 Wdrożenie Pico w klasie głównej
Konkretne komponenty są wybierane na podstawie konfiguracji w jednym miejscu (podczas rejestracji komponentów) Każdy komponent może być testowany automatycznie © Michał Małecki 2004

24 Podsumowanie Malutki kontener znacznie poprawiający jakość budowanych aplikacji Porty – C#, PHP, Ruby Brak standardowych usług, oferowanych przez Spring © Michał Małecki 2004

25 Odnośniki http://picocontainer.org/ http://www.springframework.org/
© Michał Małecki 2004

26 Podsumowanie Pytania?? © Michał Małecki 2004


Pobierz ppt "Wstęp do kontenerów IoC"

Podobne prezentacje


Reklamy Google