Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00444 008669 10464240 na godz. na dobę w sumie
Spring w praktyce - książka
Spring w praktyce - książka
Autor: , Liczba stron: 592
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-8184-6 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> j2ee - programowanie
Porównaj ceny (książka, ebook, audiobook).

Lektura obowiązkowa dla programistów Javy!

Spring Framework zrewolucjonizował sposób wytwarzania aplikacji w języku Java. Rzeczy trudne do wykonania stały się łatwe, a te łatwe w zasadzie zaczęły robić się same. Od pierwszej wersji ten framework jest cały czas rozwijany, a obecna, trzecia wersja, jest prawdopodobnie najczęściej wybieranym narzędziem do tworzenia aplikacji. Co sprawiło, że Spring zyskał taką popularność? Ogrom możliwości, świetna architektura, duża społeczność oraz ciągły rozwój i wsparcie dla nowych technologii to jego główne atuty.

W tej książce znajdziesz najlepsze techniki pracy ze Spring Framework w wersji 3. Przekonasz się, jak skutecznie wykorzystać potencjał Spring MVC. Dowiesz się, jak uwierzytelniać użytkowników, korzystać ze Spring Web Flow oraz budować usługi sieciowe. Ponadto przekonasz się, jak proste może być pisanie testów integracyjnych oraz korzystanie z narzędzi do mapowania obiektowo-relacyjnego. Książka ta jest doskonałą lekturą dla wszystkich programistów korzystających z języka Java. Z pewnością wzbogaci ona ich warsztat oraz umiejętności.

Dzięki tej książce:

Najlepsze techniki pracy ze Spring 3!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Spring in Practice Tłumaczenie: Paweł Gonera Projekt okładki: Studio Gravite/Olsztyn Obarek, Pokoński, Pazdrijowski, Zaprucki ISBN: 978-83-246-8184-6 Original edition copyright © 2013 by Manning Publications Co. All rights reserved. Polish edition copyright © 2014 by HELION SA. All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie bierze jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Wydawnictwo HELION nie ponosi również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Materiały graficzne na okładce zostały wykorzystane za zgodą Shutterstock Images LLC. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/sprip.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/spripr Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:258)ci Wprowadzenie 9 Podzi(cid:218)kowania 11 O Spring 13 O ksi(cid:200)(cid:285)ce 15 Rozdzia(cid:239) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci 19 1.1. Czym jest Spring i dlaczego z niego korzystamy? 19 1.1.1. 1.1.2. G(cid:239)ówne elementy biblioteki 20 Dlaczego warto korzysta(cid:202) ze Spring? 22 1.2. Elastyczna konfiguracja z u(cid:285)yciem wstrzykiwania zale(cid:285)no(cid:258)ci 23 1.3. Odwrócenie kontroli 26 Konfigurowanie zale(cid:285)no(cid:258)ci w stary sposób 23 1.2.1. 1.2.2. Wstrzykiwanie zale(cid:285)no(cid:258)ci 24 1.2.3. Przyk(cid:239)ad prostej konfiguracji ziarna 28 Tworzenie obiektów domeny 28 1.3.1. Tworzenie interfejsu DAO konta oraz jego implementacji 29 1.3.2. Konfigurowanie CsvAccountDao za pomoc(cid:200) Spring 31 1.3.3. 1.3.4. Tworzenie us(cid:239)ugi wyszukuj(cid:200)cej konta niesolidnych d(cid:239)u(cid:285)ników 32 Pod(cid:239)(cid:200)czanie AccountService do CsvAccountDao 33 1.3.5. 1.4. (cid:146)(cid:200)czenie ziaren za pomoc(cid:200) XML 35 1.4.1. 1.4.2. 1.4.3. 1.4.4. Przegl(cid:200)d przestrzeni nazw beans 35 Zakres ziaren 39 Przestrze(cid:241) nazw p 43 Przestrze(cid:241) nazw c 44 1.5. Automatyczne (cid:239)(cid:200)czenie oraz skanowanie komponentów z u(cid:285)yciem adnotacji 46 Adnotacja @Autowired 46 Adnotacje stereotypów 49 Skanowanie komponentów 50 XML czy adnotacje? Co jest lepsze? 51 1.5.1. 1.5.2. 1.5.3. 1.5.4. Podsumowanie 52 1.6. Rozdzia(cid:239) 2. Trwa(cid:239)o(cid:258)(cid:202) danych, ORM i transakcje 53 2.1. Dost(cid:218)p do danych za pomoc(cid:200) JDBC 55 2.2. Wyszukiwanie DataSource za pomoc(cid:200) JNDI 60 2.3. Odwzorowanie obiektowo-relacyjne i transakcje z u(cid:285)yciem Hibernate 62 2.4. Tworzenie warstwy dost(cid:218)pu do danych 73 2.5. U(cid:285)ycie JPA (opcjonalnie) 79 2.6. 2.7. Przegl(cid:200)d Spring Data JPA (opcjonalnie) 83 Podsumowanie 85 Poleć książkęKup książkę 4 Spis tre(cid:258)ci Rozdzia(cid:239) 3. Budowanie aplikacji WWW przy u(cid:285)yciu Spring Web MVC 87 3.1. Podstawy Spring Web MVC 88 3.1.1. Wzorzec „model-widok-kontroler” (MVC) 88 3.1.2. 3.1.3. Czym jest Spring Web MVC? 89 Przegl(cid:200)d architektury Spring Web MVC 90 3.2. Tworzenie pierwszej aplikacji Spring Web MVC 91 3.2.1. 3.2.2. 3.2.3. 3.2.4. Konfigurowanie aplikacji 91 Prosty obiekt domeny 93 Tworzenie prostego kontrolera 94 Tworzenie widoku nadrz(cid:218)dnego i podrz(cid:218)dnego 96 3.3. Obs(cid:239)uga i przetwarzanie formularzy 97 3.3.1. 3.3.2. 3.3.3. 3.3.4. 3.3.5. 3.3.6. 3.3.7. U(cid:285)ycie obiektów domeny jako ziaren formularza 97 Dodawanie kontrolera 98 Dodawanie plików JSP formularza i podzi(cid:218)kowania 100 Aktualizowanie kontekstu aplikacji 102 Dodanie mechanizmu przekierowania po przes(cid:239)aniu 102 Dodawanie bia(cid:239)ych list wi(cid:200)zania formularza 102 Dodanie kontroli poprawno(cid:258)ci danych formularza 104 3.4. Konfigurowanie Spring Web MVC — web.xml 104 3.5. Konfigurowanie Spring Web MVC — kontekst aplikacji 106 Konfiguracja HandlerMapping 107 Konfigurowanie obiektów HandlerAdapter 112 Konfigurowanie obiektów HandlerExceptionResolver 112 Konfigurowanie obiektów ViewResolver 112 Konfigurowanie obiektu RequestToViewNameTranslator 115 Konfigurowanie innych obiektów rozpoznaj(cid:200)cych 116 3.5.1. 3.5.2. 3.5.3. 3.5.4. 3.5.5. 3.5.6. Przegl(cid:200)d technologii Spring Mobile 116 3.6.1. 3.6.2. Wykrywanie urz(cid:200)dzenia mobilnego za pomoc(cid:200) Spring Mobile 118 3.6.3. 3.6.4. 3.6.5. 3.6.6. Technologie pokrewne 127 3.7.1. 3.7.2. 3.7.3. 3.7.4. 3.7.5. Podsumowanie 128 Spring Web Flow 127 Spring JavaScript 127 Spring Faces 127 Spring Security 127 Us(cid:239)ugi sieciowe w stylu REST 128 Anatomia (cid:285)(cid:200)dania HTTP 117 Konfigurowanie Spring Mobile 119 Obs(cid:239)uga w(cid:239)a(cid:258)ciwo(cid:258)ci witryny 122 U(cid:285)ycie bibliotek JavaScript do poprawiania wygl(cid:200)du i dzia(cid:239)ania aplikacji 124 Prze(cid:239)(cid:200)czanie do osobnej witryny mobilnej 126 3.6. 3.7. 3.8. Rozdzia(cid:239) 4. Proste formularze WWW 129 4.1. Wy(cid:258)wietlanie formularzy 129 4.2. Wyodr(cid:218)bnianie napisów z widoku 137 4.3. Kontrola danych formularza 139 4.4. 4.5. Zapisywanie danych formularza 149 Podsumowanie 159 Poleć książkęKup książkę Rozdzia(cid:239) 5. Rozszerzanie aplikacji Spring MVC za pomoc(cid:200) Web Flow 161 Spis tre(cid:258)ci 5 5.1. Czy Spring Web Flow jest w(cid:239)a(cid:258)ciwym narz(cid:218)dziem? 162 5.2. Przegl(cid:200)d Spring Web Flow 162 5.2.1. 5.2.2. 5.2.3. 5.2.4. Definiowanie przep(cid:239)ywu 163 Pi(cid:218)(cid:202) typów stanów 164 Przej(cid:258)cia pomi(cid:218)dzy stanami 167 Dane przep(cid:239)ywu 168 5.3. Aplikacja demonstracyjna Klub pi(cid:239)karski 171 Instalacja i konfigurowanie SWF 172 Tworzenie przep(cid:239)ywów z ró(cid:285)nymi typami stanów 178 5.3.1. 5.3.2. 5.4. U(cid:285)ycie klas akcji 185 5.5. Wi(cid:200)zanie danych formularza 189 5.6. Kontrola poprawno(cid:258)ci formularzy 191 5.7. Dziedziczenia przep(cid:239)ywów i stanu 194 5.8. 5.9. Zabezpieczanie przep(cid:239)ywów WWW 197 Podsumowanie 201 Rozdzia(cid:239) 6. Uwierzytelnianie u(cid:285)ytkowników 203 Implementacja funkcji logowania, wylogowywania oraz zapami(cid:218)tywania u(cid:285)ytkownika 203 Implementacja zawsze widocznego formularza logowania 216 Pobieranie danych u(cid:285)ytkowników z bazy danych 219 6.1. 6.2. Dostosowywanie strony logowania 212 6.3. 6.4. 6.5. Modyfikowanie schematu bazy danych u(cid:285)ytkowników 223 6.6. 6.7. 6.8. Automatyczne uwierzytelnianie u(cid:285)ytkownika po rejestracji 239 6.9. Zastosowanie w(cid:239)asnej us(cid:239)ugi u(cid:285)ytkowników oraz obiektu u(cid:285)ytkownika 225 Zabezpieczanie hase(cid:239) u(cid:285)ytkowników w bazie danych 233 Podsumowanie 241 Rozdzia(cid:239) 7. Autoryzacja u(cid:285)ytkowników 243 7.1. Autoryzacja metod Java z u(cid:285)yciem poziomów autoryzacji, ról oraz uprawnie(cid:241) 245 7.2. Autoryzacja widoków JSP z u(cid:285)yciem poziomów autoryzacji, ról oraz uprawnie(cid:241) 252 7.3. Autoryzacja zasobów WWW z u(cid:285)yciem poziomów autoryzacji, ról oraz uprawnie(cid:241) 255 7.4. Autoryzacja wywo(cid:239)a(cid:241) metod bazuj(cid:200)ca na ACL 258 7.5. Wy(cid:258)wietlanie elementów nawigacyjnych oraz zawarto(cid:258)ci na podstawie ACL 277 7.6. Podsumowanie 280 Rozdzia(cid:239) 8. Komunikacja z u(cid:285)ytkownikami i klientami 281 Tworzenie formularza kontaktowego 282 8.1. 8.2. Automatyczne generowanie odpowiedzi oraz powiadomie(cid:241) pocztowych 289 8.3. 8.4. 8.5. 8.6. Przyspieszanie automatycznego generowania wiadomo(cid:258)ci e-mail 296 Subskrybowanie listy wysy(cid:239)kowej przez u(cid:285)ytkowników 301 Publikowanie strumieni RSS z nowo(cid:258)ciami 311 Podsumowanie 315 Poleć książkęKup książkę 6 Spis tre(cid:258)ci Rozdzia(cid:239) 9. Tworzenie silnika komentarzy z tekstem sformatowanym 317 Tworzenie prostego silnika komentarzy 318 9.1. 9.2. Integracja silnika komentarzy z us(cid:239)ug(cid:200) dostarczania artyku(cid:239)ów 327 9.3. Dodanie obs(cid:239)ugi tekstu sformatowanego do silnika komentarzy 336 9.4. Testowanie filtra HTML 343 9.5. Podsumowanie 346 Rozdzia(cid:239) 10. Testy integracyjne 347 10.1. Konfigurowanie programu Maven dla testów integracyjnych 348 10.2. Pisanie transakcyjnych testów (cid:258)cie(cid:285)ki pozytywnej 354 10.3. Sprawdzanie, czy testowany kod zg(cid:239)asza wyj(cid:200)tek 368 10.4. Tworzenie testów integracyjnych do weryfikowania wydajno(cid:258)ci 370 10.5. Ignorowanie testu 374 10.6. Uruchamianie testów integracyjnych na wbudowanej bazie danych 376 10.7. Podsumowanie 381 Rozdzia(cid:239) 11. Budowanie bazy danych zarz(cid:200)dzania konfiguracj(cid:200) 383 11.1. Tworzenie prostego elementu konfiguracji 387 11.2. Tworzenie zwi(cid:200)zanych ze sob(cid:200) elementów konfiguracji 393 11.3. Dodawanie us(cid:239)ugi sieciowej w stylu REST 405 11.4. Modyfikowanie CMDB po udanej kompilacji 417 11.5. Pozyskiwanie publicznych danych GitHub 422 11.6. Pozyskiwanie prywatnych danych GitHub 427 11.7. Szyfrowanie (cid:285)etonów dost(cid:218)pu do zastosowa(cid:241) produkcyjnych 437 11.8. Podsumowanie 439 Rozdzia(cid:239) 12. Budowanie silnika dostarczania artyku(cid:239)ów 441 12.1. Przechowywanie artyku(cid:239)ów w repozytorium tre(cid:258)ci 442 12.2. Tworzenie silnika dostarczania artyku(cid:239)ów dzia(cid:239)aj(cid:200)cego w (cid:258)rodowisku WWW 454 12.3. Przechowywanie artyku(cid:239)ów w repozytorium dokumentów 466 12.4. Podsumowanie 471 Rozdzia(cid:239) 13. Integracja w przedsi(cid:218)biorstwie 473 13.1. Integracja aplikacji poprzez wspóln(cid:200) baz(cid:218) danych 477 13.2. Roz(cid:239)(cid:200)czanie aplikacji za pomoc(cid:200) us(cid:239)ug sieciowych w stylu REST 482 13.3. Implementacja szyny komunikatów z u(cid:285)yciem RabbitMQ i Spring Integration 491 13.4. Tworzenie zg(cid:239)osze(cid:241) na podstawie magazynu IMAP 510 13.5. Wysy(cid:239)anie potwierdze(cid:241) po SMTP 516 13.6. Podsumowanie 520 Rozdzia(cid:239) 14. Tworzenie biblioteki aktywno(cid:258)ci witryny bazuj(cid:200)cej na Spring 521 14.1. Tworzenie szablonu bezpiecznika i wywo(cid:239)ania zwrotnego 523 14.2. Udost(cid:218)pnianie bezpieczników jako JMX MBean 537 14.3. Obs(cid:239)uga konfiguracji bazuj(cid:200)cej na AOP 542 Poleć książkęKup książkę Spis tre(cid:258)ci 7 14.4. Obs(cid:239)uga w(cid:239)asnej przestrzeni nazw 549 14.5. Obs(cid:239)uga konfiguracji korzystaj(cid:200)cej z adnotacji 557 14.6. Podsumowanie 568 Dodatek. Korzystanie z kodu przyk(cid:239)adów 569 A.1. Konfiguracja IDE i (cid:258)rodowiska 569 A.2. Organizacja kodu 569 A.3. Dost(cid:218)p do kodu 570 A.4. Budowanie kodu 571 A.5. Konfigurowanie aplikacji 571 A.6. Uruchamianie aplikacji 573 Skorowidz 575 Poleć książkęKup książkę 8 Spis tre(cid:258)ci Poleć książkęKup książkę Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci W tym rozdziale: (cid:81) G(cid:225)ówne obszary funkcjonalne Spring Framework (cid:81) Elastyczna konfiguracja z u(cid:298)yciem wstrzykiwania zale(cid:298)no(cid:286)ci (cid:81) (cid:224)(cid:261)czenie ziaren za pomoc(cid:261) XML (cid:81) Automatyczne (cid:225)(cid:261)czenie oraz skanowanie komponentów z u(cid:298)yciem adnotacji W tym rozdziale przedstawimy krótko Spring Framework, zaczynaj(cid:200)c od wyja(cid:258)nie- nia, czym on jest, i omówimy jego g(cid:239)ówne elementy. Nast(cid:218)pnie zajmiemy si(cid:218) pod- stawowymi zasadami wykorzystywanymi w Spring Framework oraz mechanizmem odwrócenia kontroli i jego wp(cid:239)ywem na wstrzykiwanie zale(cid:285)no(cid:258)ci. Na koniec poka- (cid:285)emy niewielki przyk(cid:239)ad, który ilustruje, jak korzysta(cid:202) z Spring Core Container. Zaczynamy! 1.1. Czym jest Spring i dlaczego z niego korzystamy? Spring Framework jest bibliotek(cid:200) tworzenia aplikacji dost(cid:218)pn(cid:200) na zasadach open source, która umo(cid:285)liwia uproszczenie procesu tworzenia oprogramowania biz- nesowego za pomoc(cid:200) j(cid:218)zyka Java. Biblioteka ta pozwala osi(cid:200)gn(cid:200)(cid:202) ten cel przez Poleć książkęKup książkę 20 ROZDZIA(cid:224) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci udost(cid:218)pnienie programistom modelu komponentów oraz zbioru prostych i spój- nych API, które w efektywny sposób izoluj(cid:200) ich od z(cid:239)o(cid:285)onego kodu podstawowego, wymaganego w skomplikowanych aplikacjach. W ostatnich dziewi(cid:218)ciu latach zakres tej biblioteki znacznie si(cid:218) zwi(cid:218)kszy(cid:239), ale pomimo tego pozosta(cid:239)a prosta i (cid:239)atwa w u(cid:285)yciu. Obecnie sk(cid:239)ada si(cid:218) ona z oko(cid:239)o 20 modu(cid:239)ów, które mog(cid:200) by(cid:202) podzielone na 6 podstawowych obszarów funkcjonal- nych. Jak pokazano na rysunku 1.1, obszarami tymi s(cid:200): dost(cid:218)p do danych (integracja), sie(cid:202) WWW, programowanie aspektowe (AOP), instrumentacja, podstawowy konte- ner oraz testy. Rysunek 1.1. Diagram blokowy przedstawiaj(cid:261)cy sze(cid:286)(cid:252) podstawowych obszarów funkcjonalnych Spring Modularno(cid:258)(cid:202) ta daje programistom mo(cid:285)liwo(cid:258)(cid:202) swobodnego wyboru elementów biblioteki wykorzystywanych w ich aplikacjach, bez potrzeby do(cid:239)(cid:200)czania do niej ca(cid:239)ej biblioteki. Zacznijmy od przedstawienia tych obszarów funkcjonalnych. 1.1.1. G(cid:225)ówne elementy biblioteki W kolejnych punktach przedstawimy krótkie wprowadzenie do ka(cid:285)dego z sze(cid:258)ciu podstawowych obszarów funkcjonalnych Spring. Ka(cid:285)dy z tych tematów zostanie omówiony dok(cid:239)adnie w dalszej cz(cid:218)(cid:258)ci ksi(cid:200)(cid:285)ki. PODSTAWOWY KONTENER SPRING Wi(cid:218)cej informacji na temat wstrzykiwania zale(cid:285)no(cid:258)ci znajduje si(cid:218) w podrozdziale 1.2. Na razie wystarczy wiedzie(cid:202), (cid:285)e kontener DI jest g(cid:239)ównym elementem Spring Fra- mework i zapewnia podstawowe funkcje wykorzystywane przez wszystkie inne modu(cid:239)y. Kontener zapewnia funkcje oddzielania tworzenia, konfiguracji oraz zarz(cid:200)- dzania ziarnami (b(cid:218)d(cid:200) przedstawione pó(cid:283)niej) od kodu aplikacji. Poleć książkęKup książkę 1.1. Czym jest Spring i dlaczego z niego korzystamy? 21 PROGRAMOWANIE ASPEKTOWE (AOP) Spring Framework obs(cid:239)uguje równie(cid:285) programowanie aspektowe, zarówno w prost- szej wersji, nazywanej Spring AOP, jak i rozbudowanej, AspectJ. Przedstawiony dok(cid:239)adniej w dalszej cz(cid:218)(cid:258)ci ksi(cid:200)(cid:285)ki mechanizm AOP pozwala hermetyzowa(cid:202) zadania przekrojowe (bezpiecze(cid:241)stwo, logowanie, zarz(cid:200)dzanie transakcjami) w formie aspek- tów, dzi(cid:218)ki czemu mo(cid:285)na zachowa(cid:202) modularno(cid:258)(cid:202) i mo(cid:285)liwo(cid:258)(cid:202) wielokrotnego u(cid:285)ytku kodu. Zadania takie cz(cid:218)sto nie mog(cid:200) by(cid:202) elegancko oddzielone od reszty systemu, co powoduje powielanie kodu, powstanie zale(cid:285)no(cid:258)ci pomi(cid:218)dzy systemami lub oba te efekty jednocze(cid:258)nie. Podobnie jak kontener DI, obs(cid:239)uga AOP jest niezwykle u(cid:285)yteczna dla programistów i u(cid:285)ywana do tworzenia ró(cid:285)nych cz(cid:218)(cid:258)ci samej biblioteki. Spring implementuje na przyk(cid:239)ad deklaratywne zarz(cid:200)dzanie transakcjami przez AOP, ponie- wa(cid:285) transakcje s(cid:200) zadaniami przekrojowymi. DOST(cid:265)P DO DANYCH (INTEGRACJA) Modu(cid:239) dost(cid:218)pu do danych oraz integracji zapewnia obs(cid:239)ug(cid:218) API Java Database Connectivity (JDBC), odwzorowania relacyjno-obiektowego (ORM), odwzorowania Object/XML (OXM), Java Message Service (JMS) oraz obs(cid:239)ug(cid:218) transakcji. Modu(cid:239) JDBC zapewnia warstw(cid:218) abstrakcji uwalniaj(cid:200)c(cid:200) programistów od koniecz- no(cid:258)ci pisania nudnego i nara(cid:285)onego na b(cid:239)(cid:218)dy kodu podstawowego, poniewa(cid:285) w spo- sób automatyczny zarz(cid:200)dza po(cid:239)(cid:200)czeniami bazy danych oraz pulami po(cid:239)(cid:200)cze(cid:241), jak równie(cid:285) przez odwzorowanie b(cid:239)(cid:218)dów definiowanych w produktach dostawców na standardow(cid:200) hierarchi(cid:218) wyj(cid:200)tków. U(cid:239)atwia te(cid:285) odwzorowanie obiektu java.sql. (cid:180)ResultSet na list(cid:218) obiektów domeny i wykonywanie procedur sk(cid:239)adowanych. Je(cid:285)eli wolisz korzysta(cid:202) z ORM zamiast prostego kodu JDBC obs(cid:239)uguj(cid:200)cego baz(cid:218) danych, to masz szcz(cid:218)(cid:258)cie. Modu(cid:239) ORM wspiera najlepsze dost(cid:218)pne pro- dukty, takie jak Hibernate, iBATIS, Java Data Objects (JDO) oraz Java Persi- stence API (JPA). Informacja na temat iBATIS Apache iBATIS zosta(cid:225) w roku 2010 wycofany i zast(cid:261)piony przez MyBatis (mybatis.org). Cho(cid:252) iBATIS 2 by(cid:225) obs(cid:225)ugiwany od Spring 2, to z powodu problemów z obs(cid:225)ug(cid:261) czasu Spring 3 nie zawiera jeszcze oficjalnego wsparcia tej biblioteki. Zapoznaj si(cid:266) z modu- (cid:225)em MyBatis-Spring dost(cid:266)pnym na stronie http://www.mybatis.org/spring. Modu(cid:239) OXM zapewnia warstw(cid:218) abstrakcji oferuj(cid:200)c(cid:200) prost(cid:200) i spójn(cid:200) obs(cid:239)ug(cid:218) popu- larnych narz(cid:218)dzi odwzorowania Object/XML, takich jak Castor, Java Architecture for XML Binding (JAXB), JiBX, XMLBeans oraz XStream. Modu(cid:239) JMS oferuje uproszczone API do tworzenia i konsumowania komunikatów. Ostatni z modu(cid:239)ów — transakcji — zapewnia zarówno programow(cid:200), jak i deklaratywn(cid:200) obs(cid:239)ug(cid:218) transakcji. Poleć książkęKup książkę 22 ROZDZIA(cid:224) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci SIE(cid:251) WWW Modu(cid:239) sieci WWW w Spring oferuje standardowe mechanizmy do integrowania klas Spring z aplikacjami WWW, wielocz(cid:218)(cid:258)ciowego przesy(cid:239)ania plików oraz wywo(cid:239)a(cid:241) zdalnych korzystaj(cid:200)cych z WWW. Modu(cid:239) ten ma w(cid:239)asn(cid:200) bibliotek(cid:218) „model-widok- kontroler” (MVC), korzystaj(cid:200)c(cid:200) z serwletów lub portletów, a tak(cid:285)e pozwala na inte- growanie wielu popularnych bibliotek oraz technologii takich jak Struts, JavaServer Faces (JSF), Velocity, FreeMarker oraz JavaServer Pages (JSP). TESTOWANIE Spring wspiera równie(cid:285) testowanie aplikacji. Dost(cid:218)pny jest modu(cid:239) zapewniaj(cid:200)cy obs(cid:239)ug(cid:218) zarówno biblioteki JUnit, jak i TestNG. Po ogólnym przedstawieniu Spring Framework czas na pokazanie zalet korzy- stania z tej biblioteki. 1.1.2. Dlaczego warto korzysta(cid:252) ze Spring? By(cid:202) mo(cid:285)e korzysta(cid:239)e(cid:258) z innych bibliotek lub API (a mo(cid:285)e nawet je tworzy(cid:239)e(cid:258)), które obs(cid:239)uguj(cid:200) przynajmniej jeden z mechanizmów dost(cid:218)pnych w Spring. Dlaczego mia(cid:239)- by(cid:258) przeznacza(cid:202) czas na nauczenie si(cid:218) innej biblioteki? Oprócz modelu komponen- towego oraz prostego i spójnego API, które izoluje programistów od z(cid:239)o(cid:285)onego i wra(cid:285)liwego na b(cid:239)(cid:218)dy kodu podstawowego, istnieje jeszcze kilka innych przyczyn: Jako(cid:258)(cid:202) — od projektu modu(cid:239)ów, pakietów, struktury klas oraz API a(cid:285) do implementacji i pokrycia kodu testami Spring Framework jest doskona(cid:239)ym przyk(cid:239)adem kodu open source o wysokiej jako(cid:258)ci. (cid:81) (cid:81) Modularno(cid:258)(cid:202) — jak wcze(cid:258)niej wspomnieli(cid:258)my, biblioteka posiada blisko 20 modu(cid:239)ów, co daje programistom mo(cid:285)liwo(cid:258)(cid:202) wybrania jej fragmentów wykorzystywanych w aplikacji bez konieczno(cid:258)ci do(cid:239)(cid:200)czania ca(cid:239)ej biblioteki. (cid:81) Promocja najlepszych praktyk — model programowania Spring bazuj(cid:200)cy na zwyk(cid:239)ych obiektach Java (POJO) promuje roz(cid:239)(cid:200)czanie komponentów, testowanie jednostkowe oraz inne najlepsze praktyki. (cid:81) Nieskomplikowany proces nauki — dzi(cid:218)ki spójno(cid:258)ci i prostocie API Spring nie jest zbyt trudny w nauce. Gdy b(cid:218)dziemy pokazywa(cid:202) kolejne sk(cid:239)adniki tej biblioteki, zauwa(cid:285)ysz cz(cid:218)sto wyst(cid:218)puj(cid:200)ce wzorce. Dodatkowo dost(cid:218)pne s(cid:200) setki (cid:283)róde(cid:239) drukowanych oraz internetowych, w tym równie(cid:285) fora dyskusyjne, na których cz(cid:218)sto publikuj(cid:200) informacje g(cid:239)ówni programi(cid:258)ci biblioteki. (cid:81) Popularno(cid:258)(cid:202) — jak (cid:239)atwo wywnioskowa(cid:202) z mnogo(cid:258)ci publikacji, witryn WWW oraz ofert pracy, biblioteka Spring Framework jest niemal wszechobecna. Doskona(cid:239)(cid:200) ksi(cid:200)(cid:285)k(cid:200) uzupe(cid:239)niaj(cid:200)c(cid:200) t(cid:218), któr(cid:200) w(cid:239)a(cid:258)nie czytasz, jest Spring in Action, wydanie 3. (Manning Publications 2011), której autorem jest Craig Walls. Spring oferuje wiele mo(cid:285)liwo(cid:258)ci, ale trzeba nieco czasu, aby je doceni(cid:202). Mo(cid:285)esz by(cid:202) pewien, (cid:285)e jest tego wart. Ucz(cid:200)c si(cid:218) korzystania z biblioteki Spring i stosuj(cid:200)c j(cid:200) do rozwi(cid:200)zywania problemów, przekonasz si(cid:218), (cid:285)e (cid:239)(cid:200)czy ona ze sob(cid:200) ró(cid:285)ne technologie, Poleć książkęKup książkę 1.2. Elastyczna konfiguracja z u(cid:285)yciem wstrzykiwania zale(cid:285)no(cid:258)ci 23 dzi(cid:218)ki czemu umo(cid:285)liwia tworzenie spójnych aplikacji. Zauwa(cid:285)ysz, (cid:285)e parametry konfiguracyjne nie s(cid:200) zapisywane na sta(cid:239)e w kodzie, lecz centralnie w standardowych lokalizacjach. B(cid:218)dziesz projektowa(cid:239) zale(cid:285)no(cid:258)ci mi(cid:218)dzy klasami wykorzystuj(cid:200)ce inter- fejsy, co lepiej nadaje si(cid:218) do obs(cid:239)ugi zmieniaj(cid:200)cych si(cid:218) wymaga(cid:241). Ostatecznie wykonasz wi(cid:218)cej przy mniejszym nak(cid:239)adzie pracy, poniewa(cid:285) Spring Framework obs(cid:239)uguje mechanizmy podstawowe; b(cid:218)dziesz wi(cid:218)c móg(cid:239) w wi(cid:218)kszym stopniu sku- pi(cid:202) si(cid:218) na rozwi(cid:200)zywaniu problemów biznesowych. Wiesz ju(cid:285), co mo(cid:285)e Ci zaoferowa(cid:202) Spring. Zapoznamy si(cid:218) teraz z mo(cid:285)liwo(cid:258)ciami kontenera podstawowego, pokazanymi na rysunku 1.2. Kontener podstawowy obs(cid:239)u- guje funkcje odwrócenia kontroli (IoC) oraz DI, na bazie których s(cid:200) zbudowane pozosta(cid:239)e modu(cid:239)y. Rysunek 1.2. Kontener podstawowy 1.2. Elastyczna konfiguracja z u(cid:298)yciem wstrzykiwania zale(cid:298)no(cid:286)ci Dzi(cid:218)ki kontenerom takim jak Spring mechanizm IoC sta(cid:239) si(cid:218) od kilku lat bardzo popularny. Cho(cid:202) w erze internetu wydaje si(cid:218) to co najmniej wiekiem, dla wielu programistów jest to nadal nowa i ma(cid:239)o znana koncepcja. W tym podrozdziale wyja- (cid:258)nimy, czym jest IoC, oraz przedstawimy mechanizmy, z których korzysta. B(cid:218)dziesz mia(cid:239) równie(cid:285) mo(cid:285)liwo(cid:258)(cid:202) samodzielnego skonfigurowania kontenera Spring. 1.2.1. Konfigurowanie zale(cid:298)no(cid:286)ci w stary sposób Przeanalizujmy relacje pomi(cid:218)dzy obiektem dost(cid:218)pu do danych (DAO) oraz Data (cid:180)Source, które to obiekty s(cid:200) przedstawione w poni(cid:285)szym kodzie. Aby obiekty DAO mog(cid:239)y wspó(cid:239)pracowa(cid:202) z DataSource, nale(cid:285)y w klasie JdbcAccountDao utworzy(cid:202) i zaini- cjowa(cid:202) obiekt DataSource odpowiednimi parametrami po(cid:239)(cid:200)czenia: // Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 01 (projekt Maven) package com.springinpractice.ch01.dao.jdbc; import org.apache.commons.dbcp.BasicDataSource; import com.springinpractice.ch01.dao.AccountDao; public class JdbcAccountDao implements AccountDao { private BasicDataSource dataSource; public JdbcAccountDao() { dataSource = new BasicDataSource(); dataSource.setDriverClassName( com.mysql.jdbc.Driver ); dataSource.setUrl( jdbc:mysql://localhost:3306/springbook + ?autoReconnect=true ); dataSource.setUsername( root ); Poleć książkęKup książkę 24 ROZDZIA(cid:224) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci dataSource.setPassword( ); } } W kodzie tym klasa JdbcAccountDao jest zale(cid:285)na od klasy JDBC DataSource. Korzysta- nie z interfejsów jest zdecydowanie najlepsz(cid:200) praktyk(cid:200). Jak pokazano na rysunku 1.3, kod zawiera równie(cid:285) zale(cid:285)no(cid:258)(cid:202) od BasicDataSource — specyficznej implementacji DataSource z projektu Apache Commons Database Connection Pool (DBCP). Rysunek 1.3. Klasa JdbcAccountDao jest zale(cid:298)na od BasicDataSource z Apache DBCP — konkretnej implementacji DataSource G(cid:239)ównym problemem jest oczywi(cid:258)cie to, (cid:285)e klasa JdbcAccountDao zawiera informa- cje na temat implementacji, tworzenia i konfiguracji interfejsu DataSource. Innym potencjalnym problemem jest konieczno(cid:258)(cid:202) wspó(cid:239)dzielenia danych o po(cid:239)(cid:200)czeniu z wieloma obiektami DAO. W wyniku zastosowania przedstawionego projektu zmiana implementacji DataSource lub jej konfiguracji mo(cid:285)e powodowa(cid:202) konieczno(cid:258)(cid:202) modyfi- kowania kodu w wielu miejscach oraz ponownej instalacji po zmianie imple- mentacji DataSource lub jego konfiguracji. Jako(cid:258)(cid:202) kodu mo(cid:285)na poprawi(cid:202) przez wydzielenie z niego parametrów po(cid:239)(cid:200)cze- nia za pomoc(cid:200) java.util.Properties. Pozostanie jednak subtelniejszy problem. W poprzednim przyk(cid:239)adzie kodu to specyfikacja klasy powoduje powstanie zale(cid:285)- no(cid:258)ci. Spójrzmy teraz, w jaki sposób mo(cid:285)emy odwróci(cid:202) kontrol(cid:218) poprzez wstrzyk- ni(cid:218)cie naszych zale(cid:285)no(cid:258)ci. 1.2.2. Wstrzykiwanie zale(cid:298)no(cid:286)ci Jednym ze sposobów eliminowania konkretnych zale(cid:285)no(cid:258)ci od klasy BasicDataSource jest zdefiniowanie jej zewn(cid:218)trznie i wstrzykni(cid:218)cie jej do klasy JdbcAccountDao jako DataSource. Daje to nam spor(cid:200) elastyczno(cid:258)(cid:202), poniewa(cid:285) mo(cid:285)emy (cid:239)atwo zmienia(cid:202) konfiguracj(cid:218) w jednym miejscu. Je(cid:285)eli chcesz u(cid:285)y(cid:202) proxy dla DataSource przed ope- racj(cid:200) wstrzykni(cid:218)cia, mo(cid:285)esz to zrobi(cid:202). W przypadku uruchamiania testów jednost- kowych mo(cid:285)esz zast(cid:200)pi(cid:202) DataSource imitacj(cid:200) — to równie(cid:285) da si(cid:218) zrobi(cid:202). Mecha- nizm DI zapewnia du(cid:285)(cid:200) elastyczno(cid:258)(cid:202), któr(cid:200) tracimy, gdy tworzenie zale(cid:285)no(cid:258)ci jest na sta(cid:239)e zapisane w korzystaj(cid:200)cych z nich komponentach. Aby mechanizm DI móg(cid:239) dzia(cid:239)a(cid:202), musimy utworzy(cid:202) obiekt DataSource zewn(cid:218)trz- nie, a nast(cid:218)pnie albo utworzy(cid:202) obiekt DAO z jego u(cid:285)yciem, albo ustawi(cid:202) go za pomoc(cid:200) metody ustawiaj(cid:200)cej, jak pokazano poni(cid:285)ej: // Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 02 (projekt Maven) package com.springinpractice.ch01.dao.jdbc; import javax.sql.DataSource; import com.springinpractice.ch01.dao.AccountDao; Poleć książkęKup książkę 1.2. Elastyczna konfiguracja z u(cid:285)yciem wstrzykiwania zale(cid:285)no(cid:258)ci 25 public class JdbcAccountDao implements AccountDao { private DataSource dataSource; public JdbcAccountDao() {} public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } } Zwró(cid:202) uwag(cid:218), (cid:285)e DAO nie posiada ju(cid:285) na sta(cid:239)e zapisanej zale(cid:285)no(cid:258)ci od BasicData (cid:180)Source. Zauwa(cid:285), (cid:285)e wiersz z importem klasy BasicDataSource zosta(cid:239) usuni(cid:218)ty. Poniewa(cid:285) zale(cid:285)no(cid:258)(cid:202) jest inicjowana poprzez metod(cid:218) ustawiaj(cid:200)c(cid:200), nie jest konieczne definiowanie konstruktora, za pomoc(cid:200) którego by(cid:239) inicjowany obiekt DataSource. Innym sposobem refaktoryzacji tej klasy jest przekazanie implementacji DataSource jako argumentu konstruktora. Oba podej(cid:258)cia s(cid:200) znacznym usprawnieniem kodu. Mo(cid:285)esz jednak argumentowa(cid:202), (cid:285)e uda(cid:239)o si(cid:218) nam jedynie przenie(cid:258)(cid:202) tworzenie zale(cid:285)- no(cid:258)ci w inne miejsce kodu. Spójrzmy na us(cid:239)ug(cid:218) tworz(cid:200)c(cid:200) DAO: //Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 02 (projekt Maven) package com.springinpractice.ch01.service; import java.util.Properties; import java.io.InputStream; import org.apache.commons.dbcp.BasicDataSource; import com.springinpractice.ch01.dao.jdbc.JdbcAccountDao; public class AccountService { private JdbcAccountDao accountDao; public AccountService() { try { Properties props = new Properties(); InputStream inputStream = this.getClass().getClassLoader() .getResourceAsStream( dataSource.properties ); props.load(inputStream); BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName( props.getProperty( driverClassName )); dataSource.setUrl(props.getProperty( url )); dataSource.setUsername(props.getProperty( username )); dataSource.setPassword(props.getProperty( password )); accountDao = new JdbcAccountDao(); accountDao.setDataSource(dataSource); } catch (Exception e) { throw new RuntimeException(e); } } } W jednym aspekcie pogorszyli(cid:258)my nasz kod: wprowadzili(cid:258)my zale(cid:285)no(cid:258)ci pomi(cid:218)dzy AccountService a BasicDataSource — relacje, których oczywi(cid:258)cie nie chcemy. Mamy równie(cid:285) zale(cid:285)no(cid:258)(cid:202) pomi(cid:218)dzy AccountService a JdbcAccountDao (klasa konkretna), wi(cid:218)c Poleć książkęKup książkę 26 ROZDZIA(cid:224) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci nadal jeste(cid:258)my w punkcie wyj(cid:258)cia (patrz rysunek 1.4)! Bardzo (cid:239)atwo pokaza(cid:202), (cid:285)e ca(cid:239)y graf zale(cid:285)no(cid:258)ci dla okre(cid:258)lonego systemu mo(cid:285)e sta(cid:202) si(cid:218) skomplikowany i ma(cid:239)o ela- styczny z powodu w(cid:218)z(cid:239)ów, które trudno jest usun(cid:200)(cid:202). Rysunek 1.4. Teraz JdbcAccountDao posiada oczekiwan(cid:261) zale(cid:298)no(cid:286)(cid:252) od DataSource, ale AccountService posiada odwo(cid:225)ania do dwóch klas konkretnych Nie oznacza to, (cid:285)e DI by(cid:239)o nieudanym eksperymentem. Poszli(cid:258)my we w(cid:239)a(cid:258)ciwym kierunku. Aby ulepszy(cid:202) nasz mechanizm, musimy zaj(cid:200)(cid:202) si(cid:218) tym, co realizuje wstrzy- kiwanie. 1.2.3. Odwrócenie kontroli Dobrym pomys(cid:239)em jest usuni(cid:218)cie DI z kodu klienckiego i przekazanie go do Spring. W takim scenariuszu kod klienta nie zawiera (cid:285)(cid:200)dania ani wyszukiwania klasy AccountService. Zamiast tego implementacja AccountService jest w sposób przezro- czysty wstrzykiwana do kodu klienta w momencie jego inicjalizacji. W poni(cid:285)szym fragmencie kodu przedstawiona jest klasa AccountService z zale(cid:285)no(cid:258)ci(cid:200) od interfejsu AccountDao: //Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 03 (projekt Maven) package com.springinpractice.ch01.service; import com.springinpractice.ch01.dao.AccountDao; public class AccountService { private AccountDao accountDao; public AccountService() {} public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } } W jaki sposób zdefiniowa(cid:202) (cid:239)a(cid:241)cuch zale(cid:285)no(cid:258)ci? W przypadku Spring jedn(cid:200) z mo(cid:285)li- wo(cid:258)ci jest podej(cid:258)cie deklaratywne z wykorzystaniem XML, jak pokazano na poni(cid:285)- szym listingu. Listing 1.1. Plik konfiguracyjny Spring definiuj(cid:261)cy relacje mi(cid:266)dzy obiektami ?xml version= 1.0 encoding= UTF-8 ? !-- Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 03 (projekt Maven) -- beans xmlns= http://www.springframework.org/schema/beans xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance Poleć książkęKup książkę 1.2. Elastyczna konfiguracja z u(cid:285)yciem wstrzykiwania zale(cid:285)no(cid:258)ci 27 xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd bean id= dataSource class= org.apache.commons.dbcp.BasicDataSource destroy-method= close property name= driverClassName value= com.mysql.jdbc.Driver / property name= url value= jdbc:mysql://localhost:3306/springbook?autoReconnect=true / property name= username value= someusername / property name= password value= somepassword / /bean Obiekt DataSource wraz ze skonfiguro- wanymi parametrami bean id= accountDao class= com.springinpractice.ch01.dao.jdbc.JdbcAccountDao property name= dataSource ref= dataSource / /bean bean id= accountService class= com.springinpractice.ch01.service.AccountService property name= accountDao ref= accountDao / /bean /beans Obiekt DataSource wstrzykni(cid:266)ty do JdbcAccountDao Obiekt JdbcAccountDao wstrzykni(cid:266)ty do AccountService Je(cid:285)eli zaczynasz prac(cid:218) z bibliotek(cid:200) Spring, taka konfiguracja mo(cid:285)e by(cid:202) dla Ciebie nieznana, ale jej znaczenie powinno by(cid:202) wystarczaj(cid:200)co jasne. We fragmencie deklarujemy DataSource i ustawiamy jego w(cid:239)a(cid:258)ciwo(cid:258)ci za pomoc(cid:200) parametrów konfi- deklarujemy JdbcAccountDao i wstrzykujemy go do guracyjnych. We fragmencie DataSource. Podobnie we fragmencie wstrzykujemy JdbcAccountDao do AccountSer (cid:180)vice. Ostatecznym wynikiem jest uzyskanie us(cid:239)ugi, która obs(cid:239)uguje ca(cid:239)y (cid:239)a(cid:241)cuch zale(cid:285)no(cid:258)ci, ale konfiguracja jest dla niej zupe(cid:239)nie przezroczysta. Nowe, wyczysz- czone relacje s(cid:200) pokazane na diagramie klas na rysunku 1.5. Rysunek 1.5. Teraz zale(cid:298)no(cid:286)ci bazuj(cid:261) na interfejsach, a klasy konkretne s(cid:261) konfigurowane w sposób przezroczysty przez Spring Jak widzisz, struktura klas ma teraz bardziej warstwow(cid:200) budow(cid:218). Zauwa(cid:285), (cid:285)e w porównaniu z rysunkiem 1.4 warstwa górna jest zale(cid:285)na wy(cid:239)(cid:200)cznie od poni(cid:285)szych warstw, a wszystkie zale(cid:285)no(cid:258)ci s(cid:200) definiowane za pomoc(cid:200) interfejsów. Upraszcza to graf zale(cid:285)no(cid:258)ci i u(cid:239)atwia wymian(cid:218) poszczególnych w(cid:218)z(cid:239)ów. W nast(cid:218)pnym podrozdziale u(cid:285)yjemy przyk(cid:239)adu ilustruj(cid:200)cego, w jaki sposób mo(cid:285)na u(cid:285)y(cid:202) biblioteki Spring do zarz(cid:200)dzania i wstrzykiwania konkretnych implementacji naszych zale(cid:285)no(cid:258)ci. Poleć książkęKup książkę 28 1.3. ROZDZIA(cid:224) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci Przyk(cid:225)ad prostej konfiguracji ziarna Gdy mamy ju(cid:285) za sob(cid:200) odpowiedzi na pytania, co i dlaczego, spróbujmy u(cid:285)y(cid:202) DI ze Spring Framework w ma(cid:239)ej przyk(cid:239)adowej aplikacji. Aplikacja nie b(cid:218)dzie robi(cid:239)a nic powa(cid:285)nego — pozwoli nam tylko nauczy(cid:202) si(cid:218) podstaw zapisywania zale(cid:285)no(cid:258)ci i zarz(cid:200)dzania nimi z u(cid:285)yciem Spring. Zbudujemy obiekt domeny, DAO odczytuj(cid:200)ce jego zawarto(cid:258)(cid:202) z pliku CSV, us(cid:239)ug(cid:218), a nast(cid:218)pnie po(cid:239)(cid:200)czymy wszystkie te elementy ze sob(cid:200). Kod ten pozwala na uzyskanie listy kont niesolidnych d(cid:239)u(cid:285)ników w hipotetycz- nej firmie us(cid:239)ugowej. Konto niesolidnego d(cid:239)u(cid:285)nika jest definiowane jako zawieraj(cid:200)ce niezap(cid:239)acony rachunek, na które nie wp(cid:239)yn(cid:218)(cid:239)y pieni(cid:200)dze od co najmniej 30 dni. Us(cid:239)uga b(cid:218)dzie odpowiedzialna za sprawdzenie, czy konto nale(cid:285)y do niesolidnego d(cid:239)u(cid:285)nika, ale list(cid:218) potencjalnych kont uzyskamy z DAO. Przed utworzeniem DAO zdefiniujemy obiekty domeny, na których b(cid:218)dziemy pracowa(cid:202). 1.3.1. Tworzenie obiektów domeny Przyk(cid:239)adowy obiekt domeny Account, przedstawiony na poni(cid:285)szym listingu, posiada tylko te pola i metody, które s(cid:200) potrzebne do zademonstrowania mechanizmu DI w pozosta(cid:239)ych cz(cid:218)(cid:258)ciach przyk(cid:239)adowej aplikacji. Listing 1.2. Proste ziarno konta — Account.java // Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 04 (projekt Maven) package com.springinpractice.ch01.model; import java.math.BigDecimal; import java.util.Date; public class Account { private String accountNo; private BigDecimal balance; private Date lastPaidOn; public Account(String accountNo, BigDecimal balance, Date lastPaidOn) { this.accountNo = accountNo; this.balance = balance; this.lastPaidOn = lastPaidOn; } public String getAccountNo() { return accountNo; } public BigDecimal getBalance() { return balance; } public Date getLastPaidOn() { return lastPaidOn; } } Poleć książkęKup książkę 1.3. Przyk(cid:239)ad prostej konfiguracji ziarna 29 W rzeczywistej aplikacji konta nie pojawiaj(cid:200) si(cid:218) z powietrza. Mamy bazy danych, pliki i inne systemy, które przechowuj(cid:200) informacje, i mo(cid:285)emy je odczytywa(cid:202). W tym przyk(cid:239)adzie utworzymy obiekt DAO analizuj(cid:200)cy plik z warto(cid:258)ciami rozdzielanymi przecinkami (CSV), zawieraj(cid:200)cy nast(cid:218)puj(cid:200)ce dane: 100,0,09012008 200,100,08012008 300,-100,09012008 W pliku CSV o nazwie accounts.csv pierwsze pole zawiera numer konta, drugie jego stan (dodatni lub ujemny), a trzecie dat(cid:218) ostatniego wp(cid:239)ywu na konto w formacie MMDDRRRR. Jak wspominali(cid:258)my w podrozdziale 1.2, zale(cid:285)no(cid:258)ci wykorzystuj(cid:200)ce interfejsy zapewniaj(cid:200) elastyczno(cid:258)(cid:202), tworz(cid:200)c uniwersalne i modyfikowalne imple- mentacje. Zanim utworzymy DAO odpowiedzialne za wczytywanie plików, utwórzmy interfejs dla niego. 1.3.2. Tworzenie interfejsu DAO konta oraz jego implementacji Poni(cid:285)szy interfejs posiada tylko jedn(cid:200) operacj(cid:218) odczytu pozwalaj(cid:200)c(cid:200) na pobranie wszystkich kont z magazynu zaplecza, z którego okre(cid:258)lona implementacja mo(cid:285)e skorzysta(cid:202). Nie zamieszczamy tu pozosta(cid:239)ych operacji CRUD, poniewa(cid:285) w tym przyk(cid:239)adzie ich nie potrzebujemy. // Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 04 (projekt Maven) package com.springinpractice.ch01.dao; import java.util.List; import com.springinpractice.ch01.model.Account; public interface AccountDao { List Account findAll() throws Exception; } Teraz utworzymy konkretn(cid:200) implementacj(cid:218) AccountDao, która odczytuje obiekty Account z pliku CSV. Zak(cid:239)adamy, (cid:285)e nazwa pliku CSV mo(cid:285)e si(cid:218) z czasem zmieni(cid:202), wi(cid:218)c nie wpisujemy jej na sztywno. Uzasadnione jest przeniesienie tej danej do pliku w(cid:239)a(cid:258)ciwo(cid:258)ci i u(cid:285)ycie klasy java.util.Properties do jej odczytania, ale zamiast to robi(cid:202), skonfigurujemy j(cid:200) za pomoc(cid:200) Spring. Kod jest nast(cid:218)puj(cid:200)cy. Listing 1.3. Odczyt kont z pliku CSV — CsvAccountDao.java // Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 04 (projekt Maven) package com.springinpractice.ch01.dao.csv; import java.io.BufferedReader; import java.io.FileReader; import java.math.BigDecimal; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; Poleć książkęKup książkę 30 ROZDZIA(cid:224) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci import org.springframework.core.io.Resource; import com.springinpractice.ch01.dao.AccountDao; import com.springinpractice.ch01.model.Account; public class CsvAccountDao implements AccountDao { private Resource csvResource; public void setCsvResource(Resource csvFile) { this.csvResource = csvFile; } Plik CSV konfigurowany przez Spring Wymagany do wstrzykiwania za pomoc(cid:261) metody ustawiaj(cid:261)cej public List Account findAll() throws Exception { List Account results = new ArrayList Account (); Implementuje interfejs AccountDao DateFormat fmt = new SimpleDateFormat( MMddyyyy ); BufferedReader br = new BufferedReader( new FileReader(csvResource.getFile())); String line; while ((line = br.readLine()) != null) { String[] fields = line.split( , ); String accountNo = fields[0]; BigDecimal balance = new BigDecimal(fields[1]); Date lastPaidOn = fmt.parse(fields[2]); Account account = new Account(accountNo, balance, lastPaidOn); results.add(account); } br.close(); return results; } } . W klasie CsvAccountDao zadeklarowane jest pole csvFile wype(cid:239)niane przez Spring Aby Spring móg(cid:239) je dla nas wype(cid:239)ni(cid:202), wymagane jest zdefiniowanie publicznej metody ustawiaj(cid:200)cej przegl(cid:200)da plik wiersz po wierszu, dziel(cid:200)c tekst na elementy i zapisuj(cid:200)c je w obiektach domeny Account, które s(cid:200) nast(cid:218)p- nie zbierane w ArrayList i zwracane do wywo(cid:239)uj(cid:200)cego kodu1. . Metoda findAll() z punktu Brak kontroli b(cid:225)(cid:266)dów i asercji Aby upro(cid:286)ci(cid:252) przyk(cid:225)ady, pomin(cid:261)(cid:225)em kontrol(cid:266) b(cid:225)(cid:266)dów, która musi znale(cid:296)(cid:252) si(cid:266) w kodzie produkcyjnym. Na przyk(cid:225)ad w poprzednim przyk(cid:225)adzie kod produkcyjny powinien zawie- ra(cid:252) sprawdzenie, czy warto(cid:286)(cid:252) String przekazana do csvFile nie jest pusta oraz czy plik wskazywany przez ni(cid:261) faktycznie istnieje. 1 U(cid:285)yta tu metoda konfiguracji jest nazywana wstrzykiwaniem za pomoc(cid:200) settera. Spring zawiera równie(cid:285) inne metody konfiguracji ziaren oraz do(cid:239)(cid:200)czania zale(cid:285)no(cid:258)ci, w tym wstrzykiwanie z u(cid:285)yciem konstruktora oraz wstrzykiwanie metod fabryki. W ksi(cid:200)(cid:285)ce tej u(cid:285)ywamy najcz(cid:218)(cid:258)ciej tej metody, poniewa(cid:285) jest to najpopularniejsze podej(cid:258)cie. Wady i zalety strategii wstrzykiwania s(cid:200) opisane w punkcie „Constructor versus Setter Injection” artyku(cid:239)u Martina Fowlera „Inversion of Control Containers and the Dependency Injection pattern” ze stycznia 2004 roku, dost(cid:218)pnego pod adresem http://mng.bz/xvk5. Poleć książkęKup książkę 1.3. Przyk(cid:239)ad prostej konfiguracji ziarna 31 1.3.3. Konfigurowanie CsvAccountDao za pomoc(cid:261) Spring Mamy ju(cid:285) wystarczaj(cid:200)co du(cid:285)o kodu, aby skorzysta(cid:202) z mo(cid:285)liwo(cid:258)ci, jakie daje nam Spring. W Spring dost(cid:218)pne jest kilka sposobów konfigurowania obiektów i ich zale(cid:285)- no(cid:258)ci, a dwoma najpopularniejszymi s(cid:200) pliki XML oraz adnotacje. W tym punkcie skorzystamy z XML; podczas przedstawiania w podrozdziale 1.5 konfiguracji na podstawie adnotacji b(cid:218)dziemy odwo(cid:239)ywa(cid:202) si(cid:218) do zaprezentowanych tu koncepcji. Plik XML zamieszczony na poni(cid:285)szym listingu zawiera znaczniki definiuj(cid:200)ce i konfi- guruj(cid:200)ce ziarna w Spring. Listing 1.4. Plik konfiguracyjny Spring — applicationContext.xml ?xml version= 1.0 encoding= UTF-8 ? !-- Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 04 (projekt Maven) -- beans xmlns= http://www.springframework.org/schema/beans xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd Schemat ziarna Spring bean id= accountDao class= com.springinpractice.ch01.dao.csv.CsvAccountDao property name= csvResource value= accounts.csv / /bean bean id= accountService class= com.springinpractice.ch01.service.AccountService property name= accountDao ref= accountDao / /bean /beans Definicja ziarna CsvAccountDao Konfiguracja w(cid:225)a(cid:286)ciwo(cid:286)ci csvResource Zgodnie z konwencj(cid:200) programi(cid:258)ci zwykle nadaj(cid:200) temu plikowi nazw(cid:218) application Context.xml, ale mo(cid:285)e on mie(cid:202) dowoln(cid:200) nazw(cid:218). W rzeczywistych aplikacjach zwykle sensowny jest podzia(cid:239) konfiguracji Spring na wiele plików, szczególnie je(cid:285)eli s(cid:200) one du(cid:285)e i zawieraj(cid:200) wiele definicji ziaren. W takim przypadku konfiguracja jest dzielona zazwyczaj na cz(cid:218)(cid:258)ci architektoniczne, a nie funkcjonalne. Warto wi(cid:218)c two- rzy(cid:202) pliki konfiguracyjne dla DAO, us(cid:239)ug, serwletów i bezpiecze(cid:241)stwa. W dalszych cz(cid:218)(cid:258)ciach tej ksi(cid:200)(cid:285)ki poka(cid:285)emy przyk(cid:239)ady tego podej(cid:258)cia. Poniewa(cid:285) teraz chcemy zachowa(cid:202) prostot(cid:218), wystarczy nam jeden plik. Spring jest dostarczany z wieloma schematami konfiguracji ró(cid:285)nych elementów funkcyjnych, takich jak AOP czy zarz(cid:200)dzanie transakcjami. Na razie zadeklarujemy schemat beans w punkcie . Jest on najbardziej podstawowym schematem, ponie- wa(cid:285) funkcje dostarczane przez pozosta(cid:239)e schematy daj(cid:200) si(cid:218) zazwyczaj wyrazi(cid:202) (cho(cid:202) w bardziej rozbudowanej formie) jako definicje ze schematu beans. Schemat beans zawiera wszystko, co jest potrzebne do definiowania ziaren ka(cid:285)dego rodzaju, ich konfiguracji oraz (cid:239)(cid:200)czenia ze sob(cid:200). Konfiguracja Twojego pierwszego ziarna znajduje si(cid:218) w punkcie . Element bean posiada dwa atrybuty: id oraz class. Za pomoc(cid:200) atrybutu id b(cid:218)dziemy obs(cid:239)ugiwa(cid:202) zale(cid:285)no(cid:258)ci pomi(cid:218)dzy ziarnami. W atrybucie class umieszczamy w pe(cid:239)ni kwalifikowan(cid:200) Poleć książkęKup książkę 32 ROZDZIA(cid:224) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci nazw(cid:218) klasy CsvAccountDao. Spring korzysta z refleksji do tworzenia klasy w czasie obs(cid:239)ugi (cid:285)(cid:200)dania z kontenera (lub (cid:285)(cid:200)dania innej klasy, która od niej zale(cid:285)y). W punk- zadeklarowany jest element property dla w(cid:239)a(cid:258)ciwo(cid:258)ci csvResource. Równie(cid:285) cie w tym przypadku Spring korzysta z refleksji do ustawienia warto(cid:258)ci elementu zdefi- niowanego w atrybucie value. Je(cid:285)eli analizujesz do(cid:239)(cid:200)czany do ksi(cid:200)(cid:285)ki przyk(cid:239)ad kodu, znajdziesz ten plik w katalogu src/main/resources. Spring korzysta z modelu pro- gramowania JavaBeans do okre(cid:258)lenia kolejno(cid:258)ci ustawiania w(cid:239)a(cid:258)ciwo(cid:258)ci, dlatego zadeklarowali(cid:258)my metod(cid:218) ustawiaj(cid:200)c(cid:200) w obiekcie domeny Account. 1.3.4. Tworzenie us(cid:225)ugi wyszukuj(cid:261)cej konta niesolidnych d(cid:225)u(cid:298)ników Gdy mamy ju(cid:285) obiekty domeny oraz DAO, mo(cid:285)emy zbudowa(cid:202) us(cid:239)ug(cid:218), która jest odpowiedzialna za przegl(cid:200)danie wszystkich kont i wyszukiwanie niesolidnych d(cid:239)u(cid:285)- ników. Kod zamieszczony na nast(cid:218)pnym listingu jest dosy(cid:202) prosty. Listing 1.5. AccountService.java — us(cid:225)uga odpowiedzialna za wyszukiwanie niesolidnych d(cid:225)u(cid:298)ników //Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 04 (projekt Maven) package com.springinpractice.ch01.service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import com.springinpractice.ch01.dao.AccountDao; import com.springinpractice.ch01.model.Account; public class AccountService { private AccountDao accountDao; public AccountService() {} Obiekt AccountDao podstawiany przez Spring public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } Metoda ustawiaj(cid:261)ca wymagana do wstrzykiwania public List Account findDeliquentAccounts() throws Exception { List Account delinquentAccounts = new ArrayList Account (); List Account accounts = accountDao.findAll(); Wyszukiwanie niesolidnych d(cid:225)u(cid:298)ników Date thirtyDaysAgo = daysAgo(30); for (Account account : accounts) { boolean owesMoney = account.getBalance() .compareTo(BigDecimal.ZERO) 0; boolean thirtyDaysLate = account.getLastPaidOn() .compareTo(thirtyDaysAgo) = 0; if (owesMoney thirtyDaysLate) { delinquentAccounts.add(account); } } Poleć książkęKup książkę 1.3. Przyk(cid:239)ad prostej konfiguracji ziarna 33 return delinquentAccounts; } private static Date daysAgo(int days) { GregorianCalendar gc = new GregorianCalendar(); gc.add(Calendar.DATE, -days); return gc.getTime(); } } . Wyma- Zale(cid:285)no(cid:258)(cid:202) od AccountDao jest deklarowana za pomoc(cid:200) interfejsu w punkcie przegl(cid:200)damy gana metoda ustawiaj(cid:200)ca znajduje si(cid:218) w punkcie wszystkie obiekty Account zwracane przez DAO i sprawdzamy, czy nale(cid:285)y do nieso- lidnego d(cid:239)u(cid:285)nika. Je(cid:285)eli jest to takie konto, mo(cid:285)emy je doda(cid:202) do listy, która nast(cid:218)pnie jest zwracana przez metod(cid:218). . W punkcie 1.3.5. Pod(cid:225)(cid:261)czanie AccountService do CsvAccountDao Teraz po(cid:239)(cid:200)czymy AccountService z CsvAccountDao. W tym celu wystarczy doda(cid:202) pro- st(cid:200) definicj(cid:218) ziarna do pliku konfiguracyjnego applicationContext.xml, pokazanego na poni(cid:285)szym listingu. Listing 1.6. Kompletny plik konfiguracyjny Spring ?xml version= 1.0 encoding= UTF-8 ? !-- Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 04 (projekt Maven) -- beans xmlns= http://www.springframework.org/schema/beans xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd bean id= accountDao class= com.springinpractice.ch01.dao.csv.CsvAccountDao property name= csvResource value= accounts.csv / /bean bean id= accountService class= com.springinpractice.ch01.service.AccountService property name= accountDao ref= accountDao / /bean /beans Definicja ziarna AccountService Wstrzykiwanie AccountDao Podobnie jak w przypadku definicji dla klasy CsvAccountDao, umieszczonej na lis- tingu 1.4, okre(cid:258)lamy warto(cid:258)(cid:202) atrybutów id oraz class. Wa(cid:285)n(cid:200) ró(cid:285)nic(cid:200) jest tutaj okre- (cid:258)lenie sposobu wstrzykiwania AccountDao do us(cid:239)ugi. W tym przypadku korzystamy z atrybutu ref zamiast value. Atrybut ref jest u(cid:285)ywany do wstrzykiwania innych ziaren, które zdefiniowali(cid:258)my w Spring. Atrybut value pozwala na wstrzykni(cid:218)cie prostych warto(cid:258)ci oraz warto(cid:258)ci w(cid:239)a(cid:258)ciwo(cid:258)ci obiektów. Na rysunku 1.6 pokazany jest diagram klas dla obiektów. Poleć książkęKup książkę 34 ROZDZIA(cid:224) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci Rysunek 1.6. AccountService posiada po(cid:225)(cid:261)czenie z AccountDao bazuj(cid:261)ce na interfejsie, a obie te klasy zale(cid:298)(cid:261) od Account Teraz pozosta(cid:239)o nam napisa(cid:202) aplikacj(cid:218) konsolow(cid:200) do uruchomienia naszego kodu. W(cid:258)ród trzech zdefiniowanych kont tylko jedno — o numerze 200 — nale(cid:285)y do nie- solidnego d(cid:239)u(cid:285)nika. Poni(cid:285)szy kod wy(cid:258)wietla numery kont niesolidnych d(cid:239)u(cid:285)ników. Listing 1.7. Klasa ConsoleApp.java korzystaj(cid:261)ca z AccountService ze Spring // Projekt (cid:316)ród(cid:273)owy: sip01, ga(cid:273)(cid:230)(cid:316): 04 (projekt Maven) package com.springinpractice.ch01; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.springinpractice.ch01.model.Account; import com.springinpractice.ch01.service.AccountService; Kontener wstrzykiwania zale(cid:298)no(cid:286)ci public class ConsoleApp { public static void main(String[] args) throws Exception { ApplicationContext appCtx = new ClassPathXmlApplicationContext( applicationContext.xml ); AccountService accountService = (AccountService)appCtx.getBean( accountService ); List Account delinquentAccounts = accountService .findDeliquentAccounts(); for (Account a : delinquentAccounts) { System.out.println(a.getAccountNo()); } } } Odczytanie AccountService z kontenera W punkcie tworzymy obiekt ClassPathXmlApplicationContext i przekazujemy do niego lokalizacj(cid:218) pliku konfiguracyjnego okre(cid:258)lon(cid:200) wzgl(cid:218)dem zawarto(cid:258)ci zmiennej classpath. Za pomoc(cid:200) tej klasy mo(cid:285)emy uzyska(cid:202) referencj(cid:218) dowolnego ziarna zdefi- niowanego w pliku konfiguracyjnym Spring, podaj(cid:200)c tylko jego identyfikator okre- (cid:258)lony przy definicji ziarna. Interfejs ApplicationContext i jego implementacja jest naszym pomostem do ziaren Spring. W gruncie rzeczy tworzy on z(cid:239)o(cid:285)on(cid:200) implemen- tacj(cid:218) wzorca fabryki. Aby fabryka mog(cid:239)a tworzy(cid:202) ziarna, musz(cid:200) mie(cid:202) one konstruktor bezargumentowy (domy(cid:258)lny, niejawny konstruktor bezargumentowy jest wystar- czaj(cid:200)cy). Spring posiada równie(cid:285) obs(cid:239)ug(cid:218) tworzenia ziaren przy u(cid:285)yciu konstruktora Poleć książkęKup książkę 1.4. (cid:146)(cid:200)czenie ziaren za pomoc(cid:200) XML 35 z argumentami, któr(cid:200) przedstawimy w nast(cid:218)pnym podrozdziale. W punkcie otrzymujemy referencj(cid:218) do obiektu AccountService wraz z zale(cid:285)nym obiektem AccountDao, który ma skonfigurowan(cid:200) warto(cid:258)(cid:202) w(cid:239)a(cid:258)ciwo(cid:258)ci csvFile. W tym podrozdziale zbudowa(cid:239)e(cid:258) prost(cid:200) aplikacj(cid:218) z u(cid:285)yciem Spring Framework. Mo(cid:285)na zauwa(cid:285)y(cid:202), (cid:285)e pe(cid:239)na aplikacja z wieloma obiektami DAO, us(cid:239)ugami i innymi komponentami skonfigurowanymi i po(cid:239)(cid:200)czonymi przez Spring mo(cid:285)e by(cid:202) (cid:239)atwo podzielona na logiczne elementy — w przeciwie(cid:241)stwie do aplikacji pisanej w stan- dardowy sposób. Teraz, gdy przedstawili(cid:258)my ju(cid:285) podstawy, w nast(cid:218)pnym podrozdziale zajmiemy si(cid:218) dok(cid:239)adniej mo(cid:285)liwo(cid:258)ciami mechanizmów DI dost(cid:218)pnych w bibliotece. Po omówieniu przestrzeni nazw beans przedstawimy inne sposoby wstrzykiwania zale(cid:285)no(cid:258)ci, konfi- gurowania i wyodr(cid:218)bniania w(cid:239)a(cid:258)ciwo(cid:258)ci ziaren, zakres ziaren oraz zagadnienia sk(cid:239)adniowe, pozwalaj(cid:200)ce na tworzenie czytelniejszych i spójniejszych konfiguracji. 1.4. (cid:224)(cid:261)czenie ziaren za pomoc(cid:261) XML Jak ju(cid:285) pokazali(cid:258)my, ziarno Spring jest reprezentowane przez komponent POJO. Poniewa(cid:285) pozosta(cid:239)e pi(cid:218)(cid:202) obszarów funkcjonalnych Spring Framework (dost(cid:218)p do danych i integracja, sie(cid:202) WWW, AOP, instrumentacja oraz testowanie) bazuje na funkcjach udost(cid:218)pnianych przez kontener podstawowy, to zapoznanie si(cid:218) ze sposo- bami (cid:239)(cid:200)czenia ziaren jest niezb(cid:218)dne do zrozumienia Spring Framework i efektyw- nego korzystania z niego. W tym podrozdziale zapoznamy si(cid:218) z konfigurowaniem biblioteki Spring za pomoc(cid:200) plików XML. W nast(cid:218)pnych punktach przedstawimy dwie przestrzenie nazw XML, z których b(cid:218)dziemy korzysta(cid:202) w tej ksi(cid:200)(cid:285)ce: podsta- wow(cid:200) przestrze(cid:241) nazw beans oraz przydatn(cid:200) przestrze(cid:241) nazw p. 1.4.1. Przegl(cid:261)d przestrzeni nazw beans Przestrze(cid:241) nazw beans jest przestrzeni(cid:200) podstawow(cid:200) i obs(cid:239)uguje mechanizm DI; zapewnia elementy do definiowania ziaren oraz relacji pomi(cid:218)dzy nimi. Aby utworzy(cid:202) plik konfiguracyjny korzystaj(cid:200)cy z przestrzeni nazw beans, utwórz dokument XML i umie(cid:258)(cid:202) w nim odwo(cid:239)anie do schematu: ?xml version= 1.0 encoding= UTF-8 ? beans xmlns= http://www.springframework.org/schema/beans xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd /beans Plik taki stanowi pust(cid:200) konfiguracj(cid:218). Teraz mo(cid:285)esz doda(cid:202) definicj(cid:218) obiektu w we- wn(cid:218)trznym elemencie bean: beans xmlns= http://www.springframework.org/schema/beans xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd Poleć książkęKup książkę 36 ROZDZIA(cid:224) 1. Przedstawiamy Spring — kontener wstrzykiwania zale(cid:285)no(cid:258)ci bean id= accountService class= com.springinpractice.ch01.service.AccountService / /beans Zdefiniowali(cid:258)my tu AccountService przez utworzenie elementu bean z atrybutami id oraz class. Warto(cid:258)(cid:202) atrybutu id pozwala nam w prosty sposób odwo(cid:239)ywa(cid:202) si(cid:218) do ziarna. Jak pisali(cid:258)my w podrozdziale 1.3, Spring korzysta z refleksji przy two- rzeniu nowych instancji klasy zwracanych za po(cid:258)rednictwem interfejsu Application (cid:180)Context. (cid:224)(cid:260)CZENIE ZIAREN Obiekty AccountService mo(cid:285)na tworzy(cid:202) za pomoc(cid:200) s(cid:239)owa kluczowego new, ale w przy- padku warstwy us(cid:239)ug rzadko jest to tak proste. Cz(cid:218)sto zale(cid:285)(cid:200) one od obiektów DAO, obs(cid:239)ugi poczty, SOAP i innych. Mo(cid:285)liwe jest tworzenie ka(cid:285)dej z tych zale(cid:285)no(cid:258)ci programowo w konstruktorze AccountService (lub za pomoc(cid:200) statycznych metod ini- cjuj(cid:200)cych), ale prowadzi to do powstania sztywnych zale(cid:285)no(cid:258)ci, a w przypadku konieczno(cid:258)ci wymiany jednej z klas — do kaskadowych zmian. Mo(cid:285)na równie(cid:285) tworzy(cid:202) zale(cid:285)no(cid:258)ci na zewn(cid:200)trz i dodawa(cid:202) je do AccountService za pomoc(cid:200) metod ustawiaj(cid:200)cych lub argumentów konstruktora. W ten sposób mo(cid:285)na wyeliminowa(cid:202) sztywne zale(cid:285)no(cid:258)ci wewn(cid:218)trzne (o ile b(cid:218)d(cid:200) zadeklarowane poprzez interfejsy), ale zachodzi konieczno(cid:258)(cid:202) powielania kodu inicjuj(cid:200)cego. Korzystaj(cid:200)c ze Spring, mo(cid:285)na utworzy(cid:202) obiekt DAO i pod(cid:239)(cid:200)czy(cid:202) go do Account (cid:180)Service w nast(cid:218)puj(cid:200)cy sposób: bean id= accountDao class= com.springinpractice.ch01.dao.jdbc.JdbcAccountDao / bean id= accountService class= com.springinpractice.ch01.service.AccountService property name= accountDao ref= accountDao / /bean Deklaruj(cid:200)c jedynie element property dla zale(cid:285)no(cid:258)ci, wstrzykn(cid:218)li(cid:258)my obiekt JdbcAc (cid:180)countDao do AccountService. Element property posiada atrybut name, który odpo- wiada nazwie w(cid:239)a(cid:258)ciwo(cid:258)ci do ustawienia, jak równie(cid:285) atrybut ref, do którego nale(cid:285)y przypisa(cid:202) warto(cid:258)(cid:202) id ziarna do wstrzykni(cid:218)cia. Inne us(cid:239)ugi i klasy mog(cid:200) zale(cid:285)e(cid:202) od ziarna accountDao. Je(cid:285)eli jego implementacja ulegnie zmianie, na przyk(cid:239)ad z JDBC na Hibernate, to wystarczy zaktualizowa(cid:202) atrybut class w konfiguracji, bez konieczno(cid:258)ci sprawdzania wszystkich zale(cid:285)nych klas i r(cid:218)cznej wymiany zale(cid:285)no(cid:258)ci. Spring wspiera ten typ (cid:239)(cid:200)czenia, zapewniaj(cid:200)c jego prac(cid:218) nawet ze z(cid:239)o(cid:285)onymi, wielopoziomowymi grafami obiektów. WSTRZYKIWANIE Z U(cid:297)YCIEM KONSTRUKTORA I METOD USTAWIAJ(cid:260)CYCH Podobnie jak AccountService potrzebuje bezargumentowego konstruktora, Spring musi posiada(cid:202) metod(cid:218) ustawiaj(cid:200)c(cid:200) setAccountDao(), odpowiadaj(cid:200)c(cid:200) w(cid:239)a(cid:258)ciwo(cid:258)ci accountDao, aby móg(cid:239) u(cid:285)y(cid:202) refleksji do utworzenia obiektu: Poleć książkęKup książkę 1.4. (cid:146)(cid:200)czenie ziaren za pomoc(cid:200) XML 37 public class AccountService { private AccountDao accountDao; public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } //... } Taki typ wstrzykiwania jest nazywany wstrzykiwaniem z u(cid:285)yciem metody ustawiaj(cid:200)cej. Jak wcze(cid:258)niej wspominali(cid:258)my, Spring pozwala równie(cid:285) na tworzenie obiektów za pomoc(cid:200) konstruktorów z argumentami. Mo(cid:285)na wi(cid:218)c pomin(cid:200)(cid:202) metod(cid:218) ustawiaj(cid:200)c(cid:200) i zadeklarowa(cid:202) odpowiedni konstruktor: public AccountService(AccountDao accountDao) { this.accountDao = accountDao; } Zale(cid:285)no(cid:258)ci takie s(cid:200) rozwi(cid:200)zywane w nast(cid:218)puj(cid:200)cy sposób: bean id= accountService class= com.springinpractice.ch01.service.AccountService constructor-arg ref= accountDao / /bean Jak mo(cid:285)esz si(cid:218) domy(cid:258)la(cid:202), jest to nazywane wstrzykiwaniem z u(cid:285)yciem konstruktora. W ksi(cid:200)(cid:285)ce tej w wi(cid:218)kszo(cid:258)ci przypadków b(cid:218)dziemy korzysta(cid:202) ze wstrzykiwania z u(cid:285)y- ciem metody ustawiaj(cid:200)cej. KONFIGUROWANIE PROSTYCH W(cid:224)A(cid:285)CIWO(cid:285)CI ZIARNA Konfigurowana przez nas klasa JdbcAccount
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Spring w praktyce
Autor:
,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: