Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Spring Framework Tomasz Dobek t.dobek@students.mimuw.edu.pl
2
Plan prezentacji Spring z lotu ptaka Kontener Spring IoC Spring AOP Menedżer transakcji w Springu Spring DAO Testy integracyjne Podsumowanie
3
Spring Lekki kontener do budowy aplikacji Nie opisuje go żadna specyfikacja Najnowsza wersja 2.0 Istnieje też równoległy projekt Spring Webflow Spring powstał jako alternatywa dla EJB 2.1
4
Motywacja projektu Spring Wymuszamy dobry styl programowania Nie uzależniamy kodu aplikacji od naszego API Wspieramy testowanie modułów (unit-testing) poza kontenerem Wysoka konfigurowalność projektów Architekt może skroić Springa do swoich potrzeb
5
Składniki Spring Kontener IoC AOP DAO (JDBC, Hibernate, JPA, Toplink... ) Transakcje Framework MVC
6
Spring z lotu ptaka
7
Spring IoC
8
Kontener IoC Inversion of Control Zależności pomiędzy obiektami nie znajdują się w kodzie klas tych obiektów. Zależnościami zarządza kod zewnętrzny z punktu widzenia aplikacji (tu: kontenera). Wymusza to od nas myślenie interfejsami. Do realizacji tej techniki Spring używa Dependency Injection i Dependency Lookup
9
Przykład – DI przez settery Public class BlaImpl implements BlaIntf { private int intVal; Public void setIntVal(int value) { this.intVal = value; }
10
DI przez konstruktor Public class BlaImpl2 implements BlaIntf { private int intVal; public BlaImpl2(int val) { this.intVal = val;...
11
DI przez fabrykę <bean id=„factoryBean” class=„...”... <bean id=„instanceBean” class=„...” factory-bean=„factoryBean” factory-method=„createInstance”>...
12
Zależności od Beanów...
13
Dependency lookup Możemy sami poprosić kontener w naszym kodzie o Beana Interfejsy kontenera: BeanFactory ApplicationContext WebApplicationContext
14
DL - przykład Public static void main(String[] args) { InputStream is = new FileInputStream("beans.xml"); BeanFactory factory = new XmlBeanFactory(is); }
15
Zasięg Beanów Singleton (domyślny) Jedna instancja na kontener Prototype Każde żądanie tworzy nową instancję Request Session Global Session
16
Przykład - Eclipse Pobierz szkielet projektów do Eclipse’a /home/tmp/td209515/spring-workspace.tar.gz Rozpakuj i uruchom Eclipse'a wskazując rozpakowany katalog jako workspace Stwórz implementację interfejsu Stwórz plik konfiguracyjny Uruchom Main.java
17
Zaawansowane możliwości Leniwe ładowanie beanów Definiowanie własnych zakresów Definiowanie własnych znaczników w pliku konfiguracyjnym ApplicationContext Lokalizacje Sterowanie beanów zdarzeniami Auto-wiring
18
Spring AOP Framework
19
Spring AOP wprowadzenie Własny framework AOP Używa czystej Javy Ograniczona funkcjonalność Na Spring AOP zbudowana jest większość funkcjonalności Springa Spring AOP nie jest konkurencją dla np. AspectJ
20
AOP - przypomnienie Aspect Join point Advice Before advice After (returning/throwing/finally) advice Around advice Pointcut
21
Konfiguracja Spring AOP Aspekty traktowane są na równych prawach z innymi beanami. Sposoby konfiguracji: Adnotacje @AspectJ Konfiguracja w pliku XML z innymi Beanami
22
Konfiguracja - adnotacje @Aspect Public class BeforeExample { @Before(„com.xyz.myapp.Bla.operation()”) public void doAccessCheck() {... } } // przy metodzie Bla.operation() definiujemy @Pointcut...
23
Konfiguracja - XML <aop:pointcut id=„businessService” expression=„execution(* com.xyz.myapp.service.*.* (..))”/> <aop:before pointcut-ref=„businessService” method=„doAccessCheck”/>...
24
Realizacja Spring AOP Obiekt AOP Proxy pośredniczy w wywołaniach metod naszego obiektu Jeśli występuje join point wywoływany jest w odpowiedni sposób kod aspektu
25
Przykład Do poprzedniego przykładu dodaj do interfejsu 1 metodę Napisz implementację drukującą coś na konsoli Zdefiniuj aspekt pointcut i advice uruchamiający tą metodę przy wywołaniu dowolnej metody Zobacz efekt
26
Zarządca transakcji w Springu
27
Transakcje w Springu Te same poziomy ISOLATION co w JTA Te same wartości PROPAGATION co w JTA Lepsze zarządzanie wyjątkami niż w JTA Wspiera JDBC, Hibernate, JPA, JDO Deklaratywnie i/lub programistycznie Brak zależności od serwera aplikacji
28
Używanie transakcji Interfejs PlatformTransactionManager public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
29
Używanie transakcji (2) Interfejs TransactionDefinition Isolation (domyślnie: DEFAULT) Propagation (domyślnie: REQUIRED) Timeout Read-only Oczywiście wszystko konfigurujemy jako Beany z użyciem AOP
30
Transakcje - konfiguracja
31
Konfiguracja (c.d.)...
32
Konfiguracja - adnotacje @Transactional public class DefaultFooService implements FooService { Foo getFoo(String fooName); Foo getFoo(String fooName, String barName); void insertFoo(Foo foo); void updateFoo(Foo foo); }
33
Realizacja transakcji Do realizacji użyto oczywiście IoC i AOP
34
Transakcje - ciekawostki Atrybut „rollback-for” Atrybut „no-rollback-for” Transakcje programistyczne: Korzystamy z klasy TransactionTemplate Podajemy co chcemy zrobić w transakcji i o nic się nie martwimy return transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { updateOperation1(); return resultOfUpdateOperation2(); } });
35
Spring DAO
36
Integracja wielu technologii do łączenia się z warstwą danych: JDBC, Hibernate, Toplink, JDO, JPA, iBATIS SQL Maps Zunifikowany zestaw wyjątków Wiele użytecznych klas Wykonywanie najczęstszych czynności Wplatanie wywołań API danej technologii
37
Nowa hierarchia wyjątków
38
Przykład - Hibernate Mamy przykładowy mapping Hibernate Definiujemy interfejs dostępu do danych Implementujemy go używając jednej z technologi (tu: Hibernate) Konfigurujemy beany. Uruchamiamy testy. Jeśli zmienimy technologie, zmieniamy konfigurację i implementacje interfejsu
39
Konfiguracja źródła danych product.hbm.xml hibernate.dialect=org.hibernate.dialect.HSQLDialect
40
Klasa HibernateTemplate Klasa opakowująca wywołania wewnątrz API Hibernate Umożliwia wykonywanie poleceń w Hibernate API przez callbacki. Inicjujemy ją w naszej implementacji DAO przez Dependency Injection
41
Konfiguracja Beanów public class ProductDaoImpl implements ProductDao { private HibernateTemplate hibernateTemplate; public void setSessionFactory(SessionFactory sessionFactory) { this.hibernateTemplate = new HibernateTemplate(sessionFactory); } public Collection loadProductsByCategory(String category) throws DataAccessException { return this.hibernateTemplate.find("from test.Product product where product.category=?", category); }
42
Testowanie aplikacji
43
Testowanie Spring Framework wspiera TDD Pisanie testów modułów jest proste (obiekty POJO) – może być poza kontenerem Spring ułatwia pisanie testów integracyjnych.
44
Interfejsy do pisania testów AbstractDependencyInjectionSpringContextTests AbstractTransactionalDataSourceSpringContextTests
45
Wsparcie dla testów integracyjnych Cache’owanie kontenera IoC AbstractDependencyInjectionSpringContextTests ::getConfigLocations() AbstractDependencyInjectionSpringContextTests ::getConfigLocations() Wykorzystanie „auto-wiring by type” do konfigurowania beanów testowych Zawieranie testów w transakcjach i wycofywanie ich pod koniec testu
46
Pisanie beanów testujących Wystarczy napisać settery do pól Nie przeładujemy kontenera chyba że wywołamy setDirty() Transakcje: możemy zatwierdzić wołając setComplete() Mamy też dostęp do źródła danych przez JdbcTemplate Mamy za darmo dostęp do applicationContext
47
Testy integracyjne - przykład Mamy aplikację z dostępem do bazy danych Chcemy sprawdzić testami poprawność konfiguracji (Hibernate, beany, obiekty DAO)
48
Kolejne ułatwienia - adnotacje @DirtiesContext @ExpectedException(SomeException.class) @NotTransactional @Repeat(np. 10) Takie testy wymagają dziedziczenia z AbstractAnnotationAwareTransactionalTests !!!
49
Testy integracyjne - przykład public final class HibernateTitleDaoTests extends AbstractDependencyInjectionSpringContextTests { private HibernateTitleDao titleDao; public void setTitleDao(HibernateTitleDao titleDao) { this.titleDao = titleDao; } public void testLoadTitle() throws Exception { Title title = this.titleDao.loadTitle(new Long(10)); assertNotNull(title); } protected String[] getConfigLocations() { return new String[] { "classpath:com/foo/daos.xml" }; } }
50
Przykład c.d. - konfiguracja...
51
Ciekawostki – wersja 2.0 Obsługa języków dynamicznych JRuby, Groovy, BeanShell Portlet MVC Pełne wsparcie dla JMS. Biblioteka tagów JSP. Uproszczona konfiguracja w XML
52
Podsumowanie Spring ułatwia budowanie aplikacji opartej na wielu technologiach. Spring wspiera tworzenie dobrze zaprojektowanych aplikacji. Spring nie jest inwazyjny (kod). Spring wspiera TDD. Spring jest lekki.
53
Spring, a EJB3 EJB3 rozwiązał wiele problemów, które wcześniej były rozwiązane w Springu Czy Spring jest nadal potrzebny ?
54
Pytania Jeśli starczy czasu Jeśli starczy czasu Bądź na maila : t.dobek@students.mimuw.edu.pl
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.