Spring podstawy
JavaBeen i wstrzykiwanie zależności Plan wykładu Co to jest Spring? JavaBeen i wstrzykiwanie zależności Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Historia Spring J2EE jest zbyt skomplikowane, encyjne EJB są przestarzałe, złożone, nadużywane i prawie zbędne, lepiej wykorzystywać interfejsy niż dziedziczenie, komponenty JavaBean doskonale się nadają do tworzenia aplikacji, paradygmat obiektowy jest ważniejszy niż implementacja, obsługiwane wyjątki są nadużywane w aplikacjach Java, kluczową rolę pełni możliwość niezależnego testowania poszczególnych modułów. Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Co to jest Spring 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, moduły umożliwiające integrację z Toplink, Hibernate, JDO i iBATIS 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; Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Architektura Spring (I) Spring jest uzupełnieniem serwerów aplikacji cały szkielet tworzony z perspektywy aplikacji a nie serwera Pełna modułowość szkieletu można wykorzystać dowolną część Spring niezależnie od pozostałych Wysoka konfigurowalność projektów Nie uzależniamy kodu aplikacji od naszego API Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Architektura Spring (II) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Składniki Spring (I) 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. SpringAOP moduł implementujący mechanizm AOP (Aspect-Oriented Programming) i zapewniający transakcyjność przetwarzania Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Składniki Spring (II) SpringDAO 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 module integracja z Jakarta Struts i dostarczanie kontekstu aplikacjom webowym SpringMVC framework implementacja MVC obsługująca szeroką gamę technologii Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Używamy POJO (plain old java object) Podstawowe założenia Używamy POJO (plain old java object) Framework dostarcza kontener dla obiektów Framework zarządza tworzeniem obiektów Większość naszego kodu "nie wie" o istnieniu kontenera Duża elastyczność i konfigurowalność (silny XML!) Integracja i unifikacja dostępu do zewnętrznych zasobów i technologii (np. Baz danych) Projektowanie i programowanie przez interfejsy Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Beany to dowolne obiekty zarządzane przez kontener Springa. Spring Bean Wszystko jest beanem! Beany to dowolne obiekty zarządzane przez kontener Springa. Beany nie muszą implementować żadnego interfejsu, ani rozszerzać żadnej klasy Beany zazwyczaj produkowane są przez fabrykę Springa. Beany definiujemy w kontekście aplikacji za pomocą XML lub properties, kodu Javy lub innych metod. Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Każdy bean ma unikalny identyfikator i klasę. Deklaracja Bean Każdy bean ma unikalny identyfikator i klasę. Poniższa deklaracja XML definiuje najprostszy bean <bean id="prostyBean" class="spring.Bean" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Atrybuty Bean Najważniejsze atrybuty beanow deklarowane w XMLu: id - identyfikator beana class - klasa beana abstract - czy jest to bean abstrakcyjny autoWire - autoinjectowanie singleton - czy bean jest singletonem parent - nadklasa beana init-method - metoda wywoływana przy inicjacji lazy-init - czy inicjacja ma być leniwa destroy-method - metoda wywoływana przy niszczeniu beana Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Wstrzykiwanie zależności Użytkownik nie tworzy i nie łączy obiektów w aplikacji, lecz opisuje zależności między poszczególnymi klasami. Kontener jest w pełni odpowiedzialny za tworzenie obiektów i ich łączenie Metody implementacji wzorca IoC: obiekty implementują specjalny interfejs do wyszukiwania obiektów zależnych zależności są ustawiane w obiektach przez metody setter zależności są ustawiane w obiektach przez konstruktor Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Wstrzykiwanie zależności przez settery (I) public class PrzykladowyBean { private FirstBean beanOne; private SecondBean beanTwo; private int i; public void setBeanOne(FirstBean beanOne) { this.beanOne = beanOne; } public void setBeanTwo(SecondBean beanTwo) { this.beanTwo = beanTwo; } public void setIntegerProperty(int i) { this.i = i;} } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Wstrzykiwanie zależności przez settery (II) <bean id=" przykladowyBean" class=„przyklady. PrzykladowyBean"> <property name="beanOne” ref bean=”firstBean"/> </property> <property name="beanTwo" ref=”secondBean"/> <property name="integerProperty" value="1"/> </bean> <bean id=„firstBean" class=”przyklady.FirstBean"/> <bean id=„secondBean" class=”przyklady.SecondBean"/> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Wstrzykiwanie zależności przez konstruktor (I) public class PrzykladowyBean { private FirstBean beanOne; private SecondBean beanTwo; private int i; public PrzykladowyBean( FirstBean firstBean, SecondBean secondBean, int i) { this.beanOne = firstBean; this.beanTwo = secondBean; this.i = i; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Wstrzykiwanie zależności przez konstruktor (II) <bean id=”przykladowyBean" class=„przyklady.PrzykladowyBean"> <constructor-arg> <ref bean=„firstBean"/> </constructor-arg> <constructor-arg ref=„secondBean"/> <constructor-arg type="int" value="1"/> </bean> <bean id=„firstBean" class=”przyklady.FirstBean"/> <bean id=„secondBean" class=”przyklady.SecondBean"/> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Inicjalizacja Bean <bean id="msg" class="spring.msg"> <property name="message" value="Hello" /> <property name="names"> <list> <value>Marek</value> <value>Anna</value> <value>Jan</value> <value>Ewa</value> </list> </property> <property name="number" value="13" /> </bean> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Inicjalizacja Bean - przykład (I) class Pokoj { String nazwa; String lokalizacja; .... } class Uzytkownik { String imie; Pokoj pokoj; Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Inicjalizacja Bean - przykład (II) <beans> <bean id=„uzytkownikBean" class="spring.Uzytkownik"> <property name=„imie" value="Marek"/> <property name=„pokoj” ref bean=„pokojBean"/> </property> </bean> <bean id=„pokojBean" class="spring.Pokoj" > <property name=„nazwa" value=„27C"/> <property name=„lokalizacja" value=„B2"/> </beans> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Metoda inicjalizacyjna Istnieje możliwość wskazani własnych metod do inicjalizacji oraz destrukcji bean’a. public class Foo { private boolean initialized = false; public void init() { initialized = true; } <bean id="fu" class="Foo" init-method="init" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Niszczenie Bean public class Foo { private boolean initialized = false; public void dest() { initialized = true; } <bean id="fu" class="Foo" destroy-method="dest" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Fabryki komponentów (I) Podstawowa funkcjonalność Spring jest udostępniana przez pakiet org.springframework.beans. Pakiet zawiera infrastrukturę umożliwiającą wyszukiwanie i wiązanie komponentów JavaBean. BeanFactory to główna fabryka dostarczająca komponentów JavaBean i zarządzająca tworzeniem i wiązaniem komponentów, ApplicationContext to interfejs rozszerzający BeanFactory o obsługę komunikatów i internacjonalizacji, obsługę zdarzeń i możliwość rejestrowania nasłuchu zdarzeń Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Fabryki komponentów (II) Spring nie nakłada na klasy POJO żadnych dodatkowych wymagań dotyczących rozszerzanych klas lub implementowanych interfejsów Dwa tryby tworzenia komponentów: singleton: fabryka tworzy jedną instancję komponentu JavaBean o podanej nazwie, wszystkie żądania współdzielą jeden komponent, prototype: w odpowiedzi na każde żądanie fabryka tworzy nową instancję komponentu JavaBean. Fabryki dostarczają mechanizmu zarządzania cyklem życia komponentu, interfejsy InitializingBean i DisposableBean umożliwiają podejmowanie określonych akcji podczas tworzenia i niszczenia komponentu Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Fabryki komponentów (III) Sprawdzenie czy bean ma jakieś zależności. Jeśli ma to trzeba je stworzyć lub pobrać ich instancje, jeśli już zostały stworzone wcześniej. Wywołanie konstruktora lub statycznej metody z fabryki, aby dostać instancję. Ustawienie wartości pól poprzez setter – zgodnie z definicją w XMLu. Wywołanie metody inicjalizacyjnej (jeśli ją zdefiniowano). Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Zasięg Bean Singleton(domyślny) Jedna instancja na kontener Prototype Każde żądanie tworzy nową instancję Request Session Global Session <bean id="kontroler" class="Foo" scope="singleton" /> <bean id=„dao" class=„Bar" scope="prototype” /> <bean id="stan" class="Session" scope="session" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
<bean lazy-init=’’true’’ ... /> Leniwa inicjalizacja Domyślnie Spring inicjuje wszystkie pola w momencie tworzenia obiektu. Można ustawić, żeby bean był inicjowany dopiero w momencie odwołania się do niego. <bean lazy-init=’’true’’ ... /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przykładowy Bean dla kontrolera (I) <bean id="uzytkownikRekordController" class="controller.security.UzytkownikRekordController"> <property name="uzytkownikService" ref="uzytkownikService" /> <property name="urzadzenieService" ref="urzadzenieService”/> <property name="propertyEditorRegistrar" ref=”uzytkownikPropertyEditorRegistrar"/> <property name="pages"> <list> <value>uzytkownik00Dane</value> <value>uzytkownik01Lokalizacja</value> <value>uzytkownik02Sprzet</value> </list> </property> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przykładowy Bean dla kontrolera (II) <property name="pageTitles"> <list> <value>Dane uzytkownika</value> <value>Lokalizacja</value> <value>Urzadzenia</value> </list> </property> <property name="validator"> <bean class="validator.UzytkownikValidator"> <property name="maxPasswordLength" value="15"></property> <property name="minPasswordLength" value="8"></property> </bean> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Automatyczne wstrzykiwanie zależności @Autowired @Qualifier("uzytkownikDAO") private UzytkownikDAO uzytkownikDAO; Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Deklarowanie obiektów domenowych <bean id="hibernateSessionFactory” ... <property name="packagesToScan"> <list> <value>domain</value> </list> </property> </bean> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Automatyczne tworzenie beanów @Repository(”uzytkownikDAO") public class UzytkownikDAOImpl @Service("uzytkownikService") public class UzytkownikServiceImpl @Controller @Scope("session") public class UzytkownikListController <context:component-scan base-package="dao" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego