CPS 100, Spring 2010 1.1 COMPSCI 100, Spring 2010 Owen Astrachan ola.
Spring podstawy
description
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" />