320 likes | 471 Vues
Spring podstawy. Plan wykładu. Co to jest Spring ? JavaBeen i wstrzykiwanie zależności. 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,
E N D
Spring podstawy
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
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
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
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"/> </bean> </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
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> </property> 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