Spring podstawy

32
Projektowanie warstwy serwera Spring podstawy

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

Page 1: Spring podstawy

Projektowanie warstwy serwera

Springpodstawy

Page 2: Spring podstawy

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

Page 3: Spring podstawy

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.

Page 4: Spring podstawy

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;

Page 5: Spring podstawy

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

Page 6: Spring podstawy

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

6Projektowanie warstwy serwera Architektura Spring (II)

Page 7: Spring podstawy

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

Page 8: Spring podstawy

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

Page 9: Spring podstawy

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

Page 10: Spring podstawy

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.

Page 11: Spring podstawy

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" />

Page 12: Spring podstawy

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

Page 13: Spring podstawy

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

Page 14: Spring podstawy

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;} }

Page 15: Spring podstawy

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"/>

Page 16: Spring podstawy

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; }}

Page 17: Spring podstawy

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"/>

Page 18: Spring podstawy

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>

Page 19: Spring podstawy

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;....

}

Page 20: Spring podstawy

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>

Page 21: Spring podstawy

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" />

Page 22: Spring podstawy

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" />

Page 23: Spring podstawy

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ń

Page 24: Spring podstawy

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

Page 25: Spring podstawy

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).

Page 26: Spring podstawy

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" />

Page 27: Spring podstawy

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’’ ... />

Page 28: Spring podstawy

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>

Page 29: Spring podstawy

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>

Page 30: Spring podstawy

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;

Page 31: Spring podstawy

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>

Page 32: Spring podstawy

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" />