Spring podstawy

Post on 19-Feb-2016

41 views 0 download

description

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, - PowerPoint PPT Presentation

Transcript of Spring podstawy

Projektowanie warstwy serwera

Springpodstawy

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

2Projektowanie warstwy serwera 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

3Projektowanie warstwy serwera 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

4Projektowanie warstwy serwera 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

5Projektowanie warstwy serwera 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

6Projektowanie warstwy serwera Architektura Spring (II)

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

7Projektowanie warstwy serwera 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

8Projektowanie warstwy serwera 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

9Projektowanie warstwy serwera 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

10Projektowanie warstwy serwera 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

11Projektowanie warstwy serwera 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

12Projektowanie warstwy serwera 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

13Projektowanie warstwy serwera 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

14Projektowanie warstwy serwera 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

15Projektowanie warstwy serwera 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

16Projektowanie warstwy serwera 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

17Projektowanie warstwy serwera 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

18Projektowanie warstwy serwera 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

19Projektowanie warstwy serwera 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

20Projektowanie warstwy serwera 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

21Projektowanie warstwy serwera 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

22Projektowanie warstwy serwera 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

23Projektowanie warstwy serwera 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

24Projektowanie warstwy serwera 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

25Projektowanie warstwy serwera 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

26Projektowanie warstwy serwera Zasięg Bean

• Singleton(domyślny)Jedna instancja na kontener

• PrototypeKaż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

27Projektowanie warstwy serwera 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

28Projektowanie warstwy serwera 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

29Projektowanie warstwy serwera 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

30Projektowanie warstwy serwera Automatyczne wstrzykiwanie zależności

@Autowired@Qualifier("uzytkownikDAO")private UzytkownikDAO uzytkownikDAO;

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

31Projektowanie warstwy serwera 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

32Projektowanie warstwy serwera 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" />