Praktyczne wykorzystanie wzorców projektowych MVC oraz IoC. Podejście AOP (Aspect-Oriented Programing) Tomasz Dalemba Maciej Święcicki
Plan wykładu: Wzorzec MVC - wprowadzenie - przykład Wzorzec IoC - Spring Framework - przykłady AOP (Aspect–Oriented Programming) - wprowadzenie - przykład Podsumowanie
Wzorzec projektowy MVC - Wprowadzanie Model danych - opis struktur danych i powiązań Model Interfejs, czyli to co widzi użytkownik View Logika działania - powiązania między zachodzącymi zdarzeniami Controller
Schemat przykładowej aplikacji w architekturze MVC
Wzorzec projektowy MVC –Wady i zalety Łatwa zmiana interfejsu użytkownika w istniejącej aplikacji Łatwość testowania logiki biznesowej Mnogość implementacji Większa złożoność projektu Wady Zmiany w interfejsach funkcyjnych modelu pociągają za sobą zmiany w View i Controller
Wzorzec projektowy MVC – na przykładzie aplikacji JSF
Wzorzec projektowy MVC – na przykładzie aplikacji JSF Aplikacja będzie składać się z dwóch stron. Formularza logowania i strony umożliwiającej dodawanie bądź usuwanie książek z bazy danych. Strona posłuży do pobrania hasła i loginu
Wzorzec projektowy MVC – na przykładzie aplikacji JSF Strona dla Administratora - dodawanie książek - usuwanie książek
Wzorzec projektowy MVC – na przykładzie aplikacji JSF Strona dla Użytkownika - dodawanie książek
Wzorzec projektowy MVC – na przykładzie aplikacji JSF Kod strony widoku używający znaczników JSF. - Wiązanie zmiennych LOGIN i PASS oraz akcji CHECKING
Wzorzec projektowy MVC – na przykładzie aplikacji JSF Metoda CHECKING -Sprawdza czy użytkownik wprowadził poprawne dane. Jeśli tak zwracana jest ROLA
Wzorzec projektowy MVC – na przykładzie aplikacji JSF Kontroler - w zależności od zwróconej wcześniej wartości przez funkcję CHECKING przeniesie użytkownika na odpowiednią stronę.
Wzorzec projektowy MVC – na przykładzie aplikacji JSF Kontroler - Kod kontrolera zawierający przekierowania pokazane na poprzednim slajdzie. W przypadku framework’u JSF jest to plik XML
Wzorzec projektowy MVC – na przykładzie aplikacji JSF Kontroler - Wiązanie zmiennych #{bean.login}, #{bean.pass}, #{bean.chcecking} Zadaniem kontrolera jest powiązanie klasy Bean z pakietu jsf ze wskazanym kodem. login i pass są polami we wspomnianej klasie, natomiast checking jest wspomniana wcześniej metodą.
Wzorzec projektowy MVC – na przykładzie aplikacji JSF
Wzorzec projektowy Inversion of Controll - Wprowadzanie Przeniesienie na zewnątrz komponentu np. obiektu odpowiedzialności za kontrolę wybranych czynności Termin często utożsamiany z wstrzykiwaniem zależności (ang. Dependency Injection, DI) Zasada Hollywood - „to nie Państwo dzwonią do nas lecz my dzwonimy do Państwa!”
Wzorzec projektowy Inversion of Controll – Metody implementacji Typ 1. Obiekty implementują specjalny interfejs do wyszukiwania obiektów zależnych Typ 2. Zależności są ustawiane w obiektach za pomocą metody setter Typ 3. Zależności są ustawiane w obiektach za pomocą konstruktora
Wzorzec projektowy Inversion of Controll – Inne cechy Lekki” „kontener Kontenery IoC często nazywane są „lekkimi” (ang. lightwight containers) z uwagi na ich rozmiar jak i narzut w czasie działania. Umożliwia uruchomienie kontener wewnątrz aplikacji lub innego kontenera „Black Box” Zastosowanie kontenerów jako tzn. „black box” tj. odseparowanie warstwy biznesowej od warstwy prezentacji w obrębie jednej maszyny wirtualnej
Wzorzec projektowy Inversion of Controll – Inne cechy
Wzorzec projektowy Inversion of Controll – Spring Framework 1/7 Uproszczenie aplikacji J2EE – eliminacja "martwego kodu" sklejającego poszczególne komponenty, – dostarczenie wydajnych mechanizmów IoC i AOP. Luźne wiązanie aplikacji ze szkieletem – kod aplikacji praktycznie uniezależniony od Spring API, – promowanie dobrych praktyk programowania obiektowego, – przekazanie logiki do POJO.
Wzorzec projektowy Inversion of Controll – Spring Framework 2/7 „Święta wojna” z encyjnymi komponentami EJB - Odpowiedź na trudności w implementacji komponentów encyjnych EJB Ułatwienie procesu testowania aplikacji – tworzenie aplikacji w oparciu o testy (TDD, test-driven development), – umożliwienie testowania obiektów biznesowych poza kontenerem.
Wzorzec projektowy Inversion of Controll – Spring Framework 3/7 Schemat architektury SPRING
Wzorzec projektowy Inversion of Controll – Spring Framework 4/7 Wsparcie dla istniejących technologii (Hibernate,SOAP,JMX,JMS, języki skryptowe,JSP/Servlet) Wsparcie dla AOP Możliwość pisania testów (Junit,TestNG) Wsparcie dla “annotations” Wsparcie dla modułów i hierarchia kontenerów Inne jęzki programowania i IoC
Wzorzec projektowy Inversion of Controll – Spring Framework 5/7 Wielowarstwowy szkielet aplikacji Java/J2EE zawierający: – lekki kontener umożliwiający scentralizowane zarządzanie i łączenie komponentów JavaBean i POJO, – warstwę zarządzania transakcjami, – warstwę obsługi JDBC wraz z hierarchią wyjątków, – moduły umożliwiające integrację z Toplink, Hibernate, JDO i iBATIS SQL Maps za pomocą standardowych DAO, – pełnowartościowe środowisko obsługujące paradygmat programowania aspektowego AOP, – elastyczne środowisko do tworzenia aplikacji internetowych zgodnie z modelem MVC umożliwiające integrację ze Struts, WebWork, Tapestry; Spring MVC wspiera także wiele technologii implementowania warstwy widoku, np. JSP, Velocity, Tiles.
Wzorzec projektowy Inversion of Controll – Spring Framework 6/7 Kontener Podstawowa część architektury, głównym składnikiem jest BeanFactory zapewniająca mechanizm IoC (Inversion of Control) Spring context Plik konfiguracyjny dostarczający opis środowiska: JNDI, EJB,wielojęzyczność, walidacja, itp. Spring AOP Moduł implementujący mechanizm AOP (Aspect-Oriented Programming) i zapewniający transakcyjność przetwarzania
Wzorzec projektowy Inversion of Controll – Spring Framework 7/7 Spring DAO Hierarchia wyjątków ujednolicająca kody błędów różnych baz danych Spring ORM Szablony ułatwiające korzystanie z narzędzi ORM Spring Web Integracja z Jakarta Struts i dostarczanie kontekstu aplikacjom webowym Spring Web Implementacja MVC obsługująca szeroką gamę technologii
Wzorzec projektowy Inversion of Controll – Przykład 1/2
Wzorzec projektowy Inversion of Controll – Przykład 2/2
Wzorzec projektowy IoC – przykłady implementacyjne
Wzorzec projektowy IoC – przykłady implementacyjne - Spring Wykorzystanie Spring - Kod na kolejnym slajdzie prezentuje wykorzystanie wzorca IoC poprzez Spring IoC - Spring nie ogranicza się jednak tylko do IoC. Służy również często jako integrator wielu różnych bibliotek. Mamy tutaj pokazaną konfigurację źródła danych. - Źródło to jest następnie przekazywane do „integratora” napisanego dla biblioteki iBatis zajmującej się mapowaniem wyników zwróconych z bazy danych na klasy Javy. Na koniec integrator zostaje przekazany do fasady (ang. Facade) , która będzie udostępniać odpowiednie metody biznesowe operujące na bazie danych
Wzorzec projektowy IoC – przykłady implementacyjne - Spring
Wzorzec projektowy IoC – przykłady implementacyjne – Spring + JSF Integracja Spring IoC z kontrolerem JSF - #{facade}
Wzorzec projektowy IoC – przykłady implementacyjne - JEE Wykorzystanie IoC w JEE - Adnotacje (Java 5.0) zamiast plików XML - Wymagany serwer aplikacja wspierający JEE 5.0 z kontenerem wspierającym servlety w wersji nie niższej niż 2.5
Wzorzec projektowy IoC – przykłady implementacyjne - JEE Wykorzystanie IoC w JEE - Jest to zwykły bean Javy. Różni się od innych tym, że ma specjalne informacje dla serwera aplikacyjnego. Chodzi o adnotacje @Stateless. Dodatkowo jak widzimy musi implementować interfejs przedstawiony na poprzednim slajdzie.
Wzorzec projektowy IoC – przykłady implementacyjne - JEE Wykorzystanie IoC w JEE - Jest to zwykły bean Javy. Różni się od innych tym, że ma specjalne informacje dla serwera aplikacyjnego. Chodzi o adnotacje @Stateless. Dodatkowo jak widzimy musi implementować interfejs przedstawiony na poprzednim slajdzie. - Serwer zarejestruje sobie pod nazwą „Pierwszy” tą implementację, którą będzie udostępniał później innym obiektom Javy.
Wzorzec projektowy IoC – przykłady implementacyjne - JEE Wykorzystanie IoC w JEE - Tutaj mamy kod jaki należy dodać do np.: dowolnego „javovego” servletu lub beana JSF, aby móc korzystać ze zdefiniowanej przez nas fasady, która udostępnia metody operujące na bazie danych. - Serwer widząc adnotacje @EJB szuka odpowiedniej implementacji interfejsu, bierze dodatkowo pod uwagę nazwę jaką wprowadziliśmy. W przypadku EJB 3.0 nie jest ona konieczna. Używa się jej tylko wówczas gdy mamy różne bean’y implementujące ten sam interfejs.
Podejście AOP (Aspect-Oriented Programing) Metoda programowania mająca na celu modularyzację kodu i likwidację nakładających się problemów przekrojowych Aspekt Nazwany problem przekrojowy Rada Dodatkowe zachowanie/czynność które zostaje zainicjowane w punkcie złączenia Miejsce w strukturze wykonywania się aplikacji w którym powinna zostać zastosowana rada Punkt złączenia
Podejście AOP (Aspect-Oriented Programing) – rodzaje rad Around advice Przed i po punkcie styku, możliwość przerwania przepływu kontroli przez zwrócenie własnej wartości lub wyjątku Before advice przed punktem styku, brak blokowania przepływu kontroli Throws advice W momencie zgłoszenia wyjątku Po poprawnym wykonaniu After advice
Podejście AOP (Aspect-Oriented Programing) – schemat Programowanie aspektowe
Podejście AOP (Aspect-Oriented Programing) – Przykład EJB 3.0 1/2 import java.util.logging.Logger; import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; public class TracingInterceptor { Logger logger = Logger.getLogger(TracingInterceptor.class.toString()); @AroundInvoke public Object trace(InvocationContext ctx) throws Exception { logger.info("Wykonuje metode biznesowa " + ctx.getTarget().getClass().getSimpleName() + "." + ctx.getMethod().getName()); return ctx.proceed(); } }
Podejście AOP (Aspect-Oriented Programing) – Przykład EJB 3.0 2/2 import java.util.logging.Logger; import javax.ejb.Stateless; import javax.interceptor.Interceptors; import pl.jaceklaskowski.ejbws.interceptors.TracingInterceptor; @Stateless @Interceptors(TracingInterceptor.class) public class MojPierwszyWsEJBBean implements MojPierwszyWsEJBLocal { Logger logger = Logger.getLogger(MojPierwszyWsEJBBean.class.toString()); public void metodaBiznesowa() { logger.info("Metoda biznesowa metodaBiznesowa wywolana poprawnie"); } } Wykonuje metode biznesow MojPierwszyWsEJBBean.metodaBiznesowa Metoda biznesowa metodaBiznesowa wywolana poprawnie
Dziękujemy za uwagę