java ee. zaawansowane wzorce projektowe

Upload: sebastian-dymek

Post on 13-Apr-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    1/30

  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    2/30

    Tytu oryginau: Professional Java EE Design Patterns

    Tumaczenie: ukasz Piwko

    ISBN: 978-83-283-1315-6

    Copyright 2015 by John Wiley & Sons, Inc., Indianapolis, Indiana.

    All Rights Reserved.This translation published under license with the original publisher John Wiley & Sons, Inc.No part of this publication may be reproduced, stored in a retrieval system or transmitted in any form or byany means, electronic, mechanical, photocopying, recording, scanning or otherwise without either the priorwritten permission of the Publisher.

    The Wrox Brand trade dress is a trademark of John Wiley & Sons, Inc. in the United States and/or othercountries. Used by permission.

    Wiley, the Wiley logo, Wrox, the Wrox logo, Wrox Programmer to Programmer, and related trade dress aretrademarks or registered trademarks of John Wiley & Sons, Inc. and/or its affiliates, in the United States

    and other countries, and may not be used without written permission. Java is registered trademark ofOracle America, Inc. All other trademarks are the property of their respective owners. John Wiley & Sons,Inc., is not associated with any product or vendor mentioned in this book.

    Translation copyright 2015 by Helion S.A.

    Wszelkie prawa zastrzeone. Nieautoryzowane rozpowszechnianie caoci lub fragmentu niniejszejpublikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metod kserograficzn,fotograficzn, a take kopiowanie ksiki na noniku filmowym, magnetycznym lub innym powodujenaruszenie praw autorskich niniejszej publikacji.

    Wszystkie znaki wystpujce w tekcie s zastrzeonymi znakami firmowymi bd towarowymi ich

    wacicieli.

    Autor oraz Wydawnictwo HELION dooyli wszelkich stara, by zawarte w tej ksice informacje byykompletne i rzetelne. Nie bior jednak adnej odpowiedzialnoci ani za ich wykorzystanie, ani za zwizanez tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nieponosz rwnie adnej odpowiedzialnoci za ewentualne szkody wynike z wykorzystania informacjizawartych w ksice.

    Wydawnictwo HELIONul. Kociuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]

    WWW: http://helion.pl(ksigarnia internetowa, katalog ksiek)

    Drogi Czytelniku!Jeeli chcesz oceni t ksik, zajrzyj pod adreshttp://helion.pl/user/opinie/javeez

    Moesz tam wpisa swoje uwagi, spostrzeenia, recenzj.

    Printed in Poland.

    Kup ksik Pole ksik Oce ksik

    Ksigarnia internetowa Lubi to! Nasza spoeczno

    http://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeezhttp://helion.pl/rf/javeezhttp://helion.pl/ro/javeezhttp://helion.pl/ro/javeezhttp://helion.pl/http://helion.pl/http://ebookpoint.pl/r/4CAKFhttp://ebookpoint.pl/r/4CAKFhttp://ebookpoint.pl/r/4CAKFhttp://helion.pl/http://helion.pl/ro/javeezhttp://helion.pl/rf/javeezhttp://helion.pl/rt/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    3/30

    Spis treci

    O autorach .......................................................................................................... 11

    O korektorze merytorycznym .......................................................................... 13

    Podzikowania .................................................................................................. 15

    Przedmowa ........................................................................................................ 17

    Wprowadzenie ................................................................................................... 19

    CZ I WPROWADZENIE DO WZORCW PROJEKTOWYCH W JAVIE EE

    Rozdzia 1. Krtki przegld wzorcw projektowych ......................................................... 27Czym jest wzorzec projektowy ........................................................................................28

    Jak odkryto wzorce i do czego s potrzebne ............................................................29Wzorce w realnym wiecie .........................................................................................30

    Podstawy wzorcw projektowych ...................................................................................31Wzorce w rozwizaniach dla biznesu .............................................................................31

    Od Javy do Javy dla biznesu .......................................................................................31Pojawienie si wzorcw Javy dla przedsibiorstw ...................................................32Wzorce projektowe a wzorce biznesowe ..................................................................33

    Stare dobre wzorce projektowe spotykaj Jav EE ..................................................33Kiedy wzorce staj si antywzorcami ........................................................................35Podsumowanie ...................................................................................................................35

    Rozdzia 2. Podstawy Javy EE .............................................................................................. 37Architektura wielowarstwowa .........................................................................................38Warstwa kliencka ...............................................................................................................39Warstwa logiki biznesowej ...............................................................................................40

    Komponent sieciowy ...................................................................................................40Warstwa EIS .......................................................................................................................40

    Serwery Java EE ..................................................................................................................41Profil sieciowy Javy EE ......................................................................................................42Podstawowe zasady Javy EE .............................................................................................42

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    4/30

    6JAVA EE. ZAAWANSOWANE WZORCE PROJEKTOWE

    Konwencja przed konfiguracj ........................................................................................43CDI ......................................................................................................................................43Interceptory ........................................................................................................................44Podsumowanie ...................................................................................................................45

    wiczenia ............................................................................................................................45

    CZ II IMPLEMENTACJA WZORCW PROJEKTOWYCH W JAVIE EE

    Rozdzia 3. Wzorzec Fasada ................................................................................................. 49Czym jest Fasada ................................................................................................................50

    Diagram klas wzorca Fasady ......................................................................................51Implementacja wzorca Fasada w zwykym kodzie rdowym ...................................52Implementacja wzorca Fasada w Javie EE ......................................................................53

    Fasada z ziarnami bezstanowymi ..............................................................................53

    Fasada ze stanowym ziarnem ....................................................................................55Gdzie i kiedy uywa wzorca Fasada ..............................................................................55Podsumowanie ...................................................................................................................56wiczenia ............................................................................................................................56

    Rozdzia 4. Wzorzec Singleton ............................................................................................ 57Czym jest Singleton ...........................................................................................................58

    Diagram klas wzorca Singleton .................................................................................59Implementacja wzorca Singleton w zwykym kodzie .............................................59

    Implementacja wzorca Singleton w Javie EE .................................................................63

    Ziarna singletonowe ....................................................................................................63Wykorzystywanie singletonw przy uruchamianiu ...............................................64Okrelanie kolejnoci uruchamiania ........................................................................65Wspbieno .............................................................................................................67

    Gdzie i kiedy uywa wzorca Singleton ..........................................................................69Podsumowanie ...................................................................................................................69wiczenia ............................................................................................................................70

    Rozdzia 5. Wstrzykiwanie zalenoci i CDI ........................................................................ 71Na czym polega wstrzykiwanie zalenoci .....................................................................72

    Implementacja wstrzykiwania zalenoci w zwykym kodzie .....................................72Implementacja wstrzykiwania zalenoci w Javie EE ...................................................75

    Adnotacja @Named ....................................................................................................76Wstrzykiwanie zalenoci i kontekst (CDI) .............................................................77CDI a EJB ......................................................................................................................78Ziarna CDI ...................................................................................................................78Adnotacja @Inject .......................................................................................................79Konteksty i zakres ........................................................................................................79Nazewnictwo i EL ........................................................................................................80

    Ziarna CDI jako wsparcie dla JSF .............................................................................80Kwalifikatory ................................................................................................................81Alternatywy ..................................................................................................................81

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    5/30

    Spis treci 7

    Stereotypy .....................................................................................................................82Inne wzorce zwizane z CDI ......................................................................................82

    Podsumowanie ...................................................................................................................83wiczenia ............................................................................................................................83

    Rozdzia 6. Wzorzec Fabryka ............................................................................................... 85Czym jest Fabryka .............................................................................................................86Metoda Fabryczna .............................................................................................................86

    Implementacja Metody Fabrycznej w zwykym kodzie .........................................88Fabryka Abstrakcyjna .......................................................................................................89

    Implementacja Fabryki Abstrakcyjnej w zwykym kodzie ....................................90Implementacja wzorca Fabryka w Javie EE ...................................................................91

    Okiezna moc kontenera CDI ..................................................................................97Gdzie i kiedy uywa wzorcw fabrycznych ................................................................100Podsumowanie .................................................................................................................101wiczenia ..........................................................................................................................101

    Rozdzia 7. Wzorzec Dekorator .......................................................................................... 103Czym jest wzorzec Dekorator ........................................................................................104

    Diagram klas wzorca Dekorator ..............................................................................105Implementacja wzorca Dekorator w zwykym kodzie ...............................................106Implementacja wzorca Dekorator w Javie EE .............................................................109

    Dekoratory bez konfiguracji XML ..........................................................................113Gdzie i kiedy uywa wzorca Dekorator ......................................................................114Podsumowanie .................................................................................................................115wiczenia ..........................................................................................................................115

    Rozdzia 8. Programowanie aspektowe (interceptory) ................................................... 117Co to jest programowanie aspektowe ...........................................................................118Implementacja AOP w zwykym kodzie ......................................................................120Aspekty w Javie EE i interceptory .................................................................................122

    Cykl ycia interceptora .............................................................................................125Interceptory na poziomie domylnym ...................................................................125Kolejno interceptorw ...........................................................................................126Interceptory CDI .......................................................................................................128

    Gdzie i kiedy uywa interceptorw .............................................................................130Podsumowanie .................................................................................................................131

    Rozdzia 9. Asynchroniczno ........................................................................................... 133Co to jest programowanie asynchroniczne ..................................................................134

    Wzorzec Asynchroniczno .....................................................................................134Implementacja asynchronicznoci w zwykym kodzie ...............................................136Programowanie asynchroniczne w Javie EE ................................................................138

    Asynchroniczne ziarna .............................................................................................138Asynchroniczne serwlety ..........................................................................................140

    Gdzie i kiedy stosowa programowanie asynchroniczne ...........................................143Podsumowanie .................................................................................................................144wiczenia ..........................................................................................................................145

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    6/30

    8JAVA EE. ZAAWANSOWANE WZORCE PROJEKTOWE

    Rozdzia 10. Usuga odmierzania czasu .............................................................................. 147Czym jest usuga odmierzania czasu .............................................................................148Implementacja czasomierza w Javie EE ........................................................................150

    Czasomierze automatyczne ......................................................................................150

    Czasomierze programowe ........................................................................................151Wyraenia czasowe ...................................................................................................153Transakcje ...................................................................................................................156

    Podsumowanie .................................................................................................................156wiczenia ..........................................................................................................................157

    Rozdzia 11. Wzorzec Obserwator ....................................................................................... 159Czym jest Obserwator .....................................................................................................160

    Opis .............................................................................................................................160Diagram klas wzorca Obserwator ...........................................................................162

    Implementacja wzorca Obserwator w zwykym kodzie .............................................162Implementacja wzorca Obserwator w Javie EE ...........................................................164Gdzie i kiedy uywa wzorca Obserwator ....................................................................169Podsumowanie .................................................................................................................170wiczenia ..........................................................................................................................170

    Rozdzia 12. Wzorzec Dostp do Danych ............................................................................ 171Czym jest wzorzec Dostp do Danych ..........................................................................172

    Diagram klas Dostpu do Danych ..........................................................................172Oglne informacje o wzorcu Dostp do Danych ........................................................173

    Wzorzec Obiekt Transferu Danych ........................................................................173API JPA i ORM ..........................................................................................................174

    Implementacja wzorca Dostp do Danych w Javie EE ...............................................174Implementacja DAO bezpieczna pod wzgldem typw ......................................179

    Gdzie i kiedy uywa wzorca Dostp do Danych ........................................................180Podsumowanie .................................................................................................................180wiczenia ..........................................................................................................................180

    Rozdzia 13. REST-owe usugi sieciowe .............................................................................. 181Co to jest REST ................................................................................................................182

    Sze warunkw REST ....................................................................................................183Klient-serwer ..............................................................................................................183Jednolity interfejs .......................................................................................................184Bezstanowo .............................................................................................................184Moliwo zapisywania danych w buforze ............................................................184System warstwowy .....................................................................................................184Kod na danie ...........................................................................................................184

    Model dojrzaoci Richardsona .....................................................................................185Poziom 0. zwyky XML ........................................................................................185

    Poziom 1. zasoby ..................................................................................................185Poziom 2. czasowniki HTTP ..............................................................................185Poziom 3. kontrolki hipermedialne ...................................................................185

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    7/30

    Spis treci 9

    Projektowanie REST-owego interfejsu API .................................................................185Nazewnictwo zasobw ..............................................................................................186Rzeczowniki, a nie czasowniki .................................................................................186Znaczenie nazw ..........................................................................................................187

    Liczba mnoga .............................................................................................................187Metody HTTP ............................................................................................................187REST w akcji .....................................................................................................................188

    Rzeczownik users .......................................................................................................188Rzeczowniki topics i posts ........................................................................................189

    Implementacja REST w Javie EE ...................................................................................191HATEOAS ........................................................................................................................194Gdzie i kiedy uywa REST ............................................................................................196Podsumowanie .................................................................................................................197wiczenia ..........................................................................................................................197

    Rozdzia 14. Wzorzec Model Widok Kontroler .............................................................. 199Czym jest wzorzec MVC ................................................................................................200

    Typy wzorca MVC ....................................................................................................201Implementacja wzorca MVC w zwykym kodzie ........................................................202Implementacja wzorca MVC w Javie EE ......................................................................206Serwlet FacesServlet .........................................................................................................206Implementacja wzorca MVC przy uyciu serwletu FacesServlet ..............................206Gdzie i kiedy uywa wzorca MVC ...............................................................................208Podsumowanie .................................................................................................................209wiczenia ..........................................................................................................................209

    Rozdzia 15. Inne wzorce projektowe w Javie EE ............................................................... 211Co to s gniazda sieciowe ...............................................................................................212Co to jest warstwa porednia do przekazywania wiadomoci ...................................214Co to jest architektura mikrousugowa ........................................................................215

    Architektura monolityczna ......................................................................................215Skalowalno ..............................................................................................................217Dekompozycja na usugi ..........................................................................................218

    Zalety architektury mikrousugowej .......................................................................218Nie ma nic za darmo .................................................................................................219Wnioski .......................................................................................................................220

    Kilka antywzorcw na zakoczenie ..............................................................................220Uberklasa ....................................................................................................................220Architektura Lazani ...................................................................................................221Pan Kolumb ................................................................................................................221Korzyci z przyjani ..................................................................................................221Supernowoczesno ..................................................................................................222Szwajcarski scyzoryk .................................................................................................222

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    8/30

    10JAVA EE. ZAAWANSOWANE WZORCE PROJEKTOWE

    CZ III PODSUMOWANIE

    Rozdzia 16. Wzorce projektowe dobre, ze i brzydkie ................................................. 225Dobre wzorce sukcesu ................................................................................................225Ze naduywanie i bdne stosowanie wzorcw .....................................................227

    Brzydkie ............................................................................................................................228Podsumowanie .................................................................................................................230

    Skorowidz ........................................................................................................ 231

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    9/30

    5Wstrzykiwanie zalenoci i CDI

    ZAWARTO ROZDZIAU:

    wprowadzenie do technik wstrzykiwania zalenoci;

    znaczenie wstrzykiwania zalenoci w Javie EE;

    implementacja wstrzykiwania zalenoci w zwykym kodzie;

    implementacja wstrzykiwania zalenoci w Javie EE;

    wprowadzenie do kontekstowego wstrzykiwania zalenoci;

    najwaniejsze rnice dzielce kontenery CDI i EJB.

    PRZYKADY KODU DO POBRANIA

    Pliki z kodem rdowym przykadw z tego rozdziau znajduj si w archiwum,

    ktre mona pobra z serwera FTP wydawnictwa Helion pod adresem:

    ftp://ftp.helion.pl/przyklady/javeez.zip. Pliki znajduj si w folderze r05,a ich nazwy odzwierciedlaj kolejne fragmenty rozdziau.

    Wstrzykiwanie zalenoci(ang. Dependency Injection DI) to jeden z nielicznych powszechnieznanych i stosowanych wzorcw projektowych, ktre niezostay opisane w ksice Bandy Czworga1.Ale obecnie wzorzec ten jest wykorzystywany w nowoczesnych jzykach programowania zarwno doimplementacji mechanizmw wewntrznych, jak i jako rodek do rozluniania powiza midzy klasami.

    Technologia J2EE miaa suy do budowania najbardziej zoonych systemw, ale spisaa si marnie,poniewa tylko nadmiernie komplikowaa proces tworzenia nawet prostszych systemw. Pierwotny

    projekt J2EE by oparty na wysokim poziomie zoonoci i cisych powizaniach midzy klasami,1 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Wzorce projektowe. Elementy oprogramowania

    obiektowego wielokrotnego uytku, Helion, 2010.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    10/30

    72 ROZDZIA 5. Wstrzykiwanie zalenoci i CDI

    co stao si bodcem do powstania i spopularyzowania rnych systemw szkieletowych, takich jak Springczy PicoContainer. W 2004 r. Martin Fowler opublikowa artyku na temat kontenerw odwrconegosterowania (ang. Inversion of Control IoC) i wzorca wstrzykiwania zalenoci2. Wikszo producentwoprogramowania nie zachcaa programistw do uywania kontenera J2EE. Wkrtce kontrol przejylekkie kontenery, ktre zaczto oficjalnie obsugiwa, i na dodatek Spring sta si w zasadzie nieoficjalnym

    standardem, doprowadzajc do tego, e Jav biznesow postanowiono zaprojektowa od nowa.

    Na czym polega wstrzykiwanie zalenociWzorzec Wstrzykiwanie Zalenoci opiera si na pomyle odwrcenia tego, do kogo naleykontrola. Zamiast tworzy zalenoci i nowe obiekty za pomoc sowa kluczowego newlubprzy uyciu operacji wyszukiwania, potrzebne zasoby wstrzykuje si do obiektu docelowego.Podejcie to ma wiele zalet:

    Klient nie musi wiedzie o rnych implementacjach wstrzykiwanych zasobw,

    co uatwia wprowadzanie zmian w projekcie. Znacznie atwiej implementuje si testy jednostkowe z wykorzystaniem atrap obiektw.

    Konfiguracj mona przenie na zewntrz, redukujc w ten sposb skutki zmian.

    Architektura oparta na lunych powizaniach uatwia tworzenie systemw wtyczkowych.

    Podstawow ide techniki wstrzykiwania zalenoci jest zmiana miejsca tworzenia obiektw orazwykorzystanie wtryskiwacza (ang. injector) do wstrzykiwania w odpowiednim momencie specyficznychimplementacji do obiektw docelowych. Moe si to wydawa podobne do implementacji wzorca Fabryka(opisanego w rozdziale 6., Wzorzec Fabryka), ale koncepcja ta jest znacznie bardziej zaawansowanani proste tworzenie obiektu. Odwrcenie sterowania cakowicie wywraca do gry nogami relacje midzy

    obiektami i przekazuje ca prac do wtryskiwacza (ktry w wikszoci przypadkw dziaa magicznie).Zamiast wywoywa fabryk, aby dostarczy implementacj wywoujcemu, wtryskiwacz aktywnie sprawdza,kiedy obiekt docelowy potrzebuje obiektu rdowego, i dokonuje wstrzyknicia w odpowiedni sposb.

    Implementacja wstrzykiwania zalenociw zwykym kodzieStandardowa implementacja wstrzykiwania zalenoci w Javie poza kontenerem EJB jest dostpna

    dopiero od czasu wprowadzenia CDI (ang. Context and Dependency Injection). Cho istniej rnesystemy szkieletowe, jak choby Spring i Guice, nietrudno jest samodzielnie zaimplementowapodstawowe rozwizanie.

    Najprostsza implementacja wzorca Wstrzykiwanie Zalenoci to fabryka tworzca zalenona danie przy uyciu metody getInstance(). Poniej przedstawiamy tak implementacj,aby pokaza, jak to si robi w zwykym kodzie.

    W implementacji tej powinno si oddzieli rozwizywanie zalenoci od zachowania klasy.Oznacza to, e klasa powinna mie okrelon funkcjonalno bez definiowania tego, jak pozyskujereferencje do klas, od ktrych zaley. W ten sposb rozcza si operacj tworzenia obiektu i miejsce

    jego uycia a to jest esencj wstrzykiwania zalenoci.

    2 Martin Fowler, Inversion of Control Containers and the Dependency Injection Pattern, 2004,

    http://martinfowler.com/articles/injection.html.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    11/30

    Implementacja wstrzykiwania zalenoci w zwykym kodzie 73

    Najpierw na listingach: 5.1, 5.2, 5.3 i 5.4 przedstawimy przykady silnie powizanych klas,a nastpnie zmienimy je zgodnie z zasadami wzorca Wstrzykiwanie Zalenoci.

    Listing 5.1. Klasa UserService tworzca now zaleno w konstruktorze

    package com.devchronicale.di;

    class UserService {

    private UserDataRepository udr;

    UserService() {

    this.udr = new UserDataRepositoryImpl();

    }

    public void persistUser(User user) {

    udr.save(user) ;

    }

    }

    Listing 5.2. Interfejs UserDataRepository

    package com.devchronicale.di;

    public interface UserDataRepository {

    public void save(User user);

    }

    Listing 5.3. Konkretna implementacja interfejsu UserDataRepository

    package com.devchronicale.di;

    public class UserDataRepositoryImpl implements UserDataRepository {

    @Override

    public void save(User user) {

    // zapisywanie danych

    }

    }

    Listing 5.4. Klasa User

    package com.devchronicale.di;

    public class User {

    // kod dotyczcy uytkownika

    }

    Przedstawiona na listingu 5.1 klasa UserServicedostarcza usugi logiki biznesowej dozarzdzania uytkownikami, np. do zapisywania informacji o uytkownikach w bazie danych.W tym przykadzie obiekt jest tworzony przez konstruktor, co wie logik biznesow(zachowanie klasy) z tworzeniem obiektu.

    Teraz zdejmiemy obowizek tworzenia obiektu z naszej klasy i przeniesiemy go do fabryki.

    Na listingu 5.5 tworzona jest implementacja klasy UserDataRepository, ktr przekazujemydo konstruktora klasy UserService. Trzeba byo zmieni konstruktor klasy UserService,aby przyjmowa nowy parametr.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    12/30

    74 ROZDZIA 5. Wstrzykiwanie zalenoci i CDI

    Listing 5.5. Klasa UserServiceFactory tworzca obiekty klasy UserService

    package com.devchronicale.di;

    public class UserServiceFactory {

    public UserService getInstance() {

    return new UserService(new UserDataRepositoryImpl()); }

    }

    Na listingu 5.6 konstruktor UserServiceda wstrzyknicia egzemplarza klasy UserDataRepository.Klasa UserServicenie jest sprzona z klas UserDataReposityImpl. Teraz to zadaniem fabryki

    jest tworzenie obiektu i wstrzykiwanie implementacji do konstruktora klasy UserService.W ten sposb oddzielilimy logik biznesow od operacji tworzenia obiektw.

    Listing 5.6. Zmieniona klasa UserService

    package com.devchronicale.di;

    class UserService {

    private UserDataRepository udr;

    UserService(UserDataRepository udr) {

    this.udr = udr;

    }

    public void persistUser(User user) {

    udr.save(user) ;

    }}

    OPOWIADANIE WOJENNE

    Gdy powierzono mi zadanie napisania aplikacji na Androida, postanowiem

    poszuka systemw szkieletowych ze wstrzykiwaniem zalenoci dla platform

    mobilnych. Jako programista z dowiadczeniem w sektorze biznesowym mylaem,

    e to najlepsze rozwizanie. Interfejs uytkownika Androida wykorzystuje przecie

    struktur przypominajc wstrzykiwanie zalenoci, wic skadniki interfejsu

    zdefiniowane w XML-u z kodem Javy, wic wydawao mi si, e implementacjakompletnego systemu wstrzykiwania zalenoci jest dobrym pomysem, ktry

    pozwoli osign oszaamiajce rezultaty.

    Opracowaem pikn architektur, w ktrej wszystkie obiekty i zasoby byy ze sob

    powizane. Wstrzykiwanie dziaao piknie, ale aplikacja nie. Uruchamiaa si

    o wiele duej ni inne podobne aplikacje i szwankowaa te w niej nawigacja.

    Wszyscy zakadalimy, e elegancki system zoony z luno powizanych skadnikw

    da si utworzy tylko przy uyciu wstrzykiwania zalenoci, wic nawet nie przyszo

    nam do gowy szuka rda problemw wanie w tej technice. Stworzylimy pikny

    i lekki interfejs uytkownika oraz wykorzystalimy asynchroniczne zadania dziaajce

    w tle, aby nie blokowa aplikacji niektrymi operacjami oraz zmniejszy ilo pracypodczas uruchamiania programu. Jednak wszystko na prno.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    13/30

    Implementacja wstrzykiwania zalenoci w Javie EE 75

    W kocu dotaro do nas, e problemem jest wstrzykiwanie zalenoci. Aplikacja podczas

    uruchamiania i wykonywania niezbdnych czynnoci pocztkowych wyszukiwaa

    wszystkie zasoby do wstrzykiwania i referencje. W serwerze, ktry uruchamia si

    nieczsto, ma wielu uytkownikw, jest rzadko restartowany i dysponuje gigantyczn

    iloci pamici, moe i byoby to dobre. Ale w przypadku urzdzenia przenonego,

    ktre ma jednego uytkownika, jest czsto restartowane i dysponuje niewielk iloci

    pamici, ponielimy sromotn klsk.

    Rozwizanie polegao na powizaniu ze sob zasobw. Cho kod zrobi si brzydszy,

    to aplikacja staa si szybka jak byskawica, co zakoczyo nasze problemy z wydajnoci.

    Mora z tej historii nie jest taki, e wstrzykiwanie zalenoci nie jest odpowiedni

    technik do stosowania w urzdzeniach przenonych, tylko taki, e jeli si j

    nieprawidowo zaimplementuje (niewane, w jakim urzdzeniu) w nieodpowiednim

    kontekcie, to mona mie powane kopoty.

    Implementacja wstrzykiwania zalenociw Javie EEStandardowo w J2EE nie byo wstrzykiwania zalenoci a do Javy EE 5. Zamiast tego w tamtychczasach dostp do ziaren i zasobw by realizowany przy uyciu interfejsu wyszukiwaniakontekstowego (ang.Java Naming and Directory Interface JNDI). Wad tej metody byozacienianie powiza midzy skadnikami i wykorzystywanie cikiego serwerowego kontenera,

    przez co testowanie wcale nie byo atwiejsze od pisania waciwego kodu.Od Javy EE 5 i EJB 3 wstrzykiwanie zalenoci jest ju integraln czci platformy Enterprise Java.W celu pozbycia si konfiguracji XML wprowadzono kilka adnotacji do wykonywania wstrzykni:

    @Resource(JSR 250) suy do wstrzykiwania takich zasobw, jak: dane, JMS(ang.Java Message Service), URL, poczta oraz zmienne rodowiskowe.

    @EJB(JSR 220) suy do wstrzykiwania ziaren EJB.

    @WebServiceRef suy do wstrzykiwania usug sieciowych.

    Od pojawienia si Javy EE 6, CDI oraz EJB 3.1 technika wstrzykiwania zalenoci staa si

    znacznie bardziej przydatna, a wic te i bardziej interesujca dla programistw Javy EE.W EJB 3.1 ziarna nie musz ju mie interfejsw. Ponadto wprowadzono nowy interfejs sieciowyEJB zapewniajcy uproszczony i lejszy kontener EJB. Dodano te now i ulepszon adnotacjwstrzykiwania @Inject(JSR 229 i JSR 330), ktra stanowia wsplny interfejs do wstrzykiwaniadla rnych systemw z krlestwa Javy.

    Wstrzykiwanie przy uyciu adnotacji @Injectjest bezpieczne pod wzgldem typw, poniewaodbywa si na podstawie typu referencji do obiektu. Gdybymy chcieli dostosowa do nowychzasad kod z listingu 5.1, usunlibymy z niego konstruktor i dodalibymy adnotacj @Injectdo pola UserDataRepository. Wygldaoby to tak jak na listingu 5.7.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    14/30

    76 ROZDZIA 5. Wstrzykiwanie zalenoci i CDI

    Listing 5.7. Klasa UserService z uyciem adnotacji @Inject

    package com.devchronicale.di;

    import javax.inject.Inject;

    class UserService {

    @Inject

    private UserDataRepository udr;

    public void persistUser(User user) {

    udr.save(user);

    }

    }

    Kontener CDI tworzy jeden egzemplarz klasy UserRepositoryImpljako ziarno zarzdzaneprzez kontener i wstrzykuje go wszdzie tam, gdzie znajdzie adnotacj @Injectprzy polu typuUserDataRepository.

    Ziarna zarzdzane przez kontener mona wstrzykiwa do konstruktorw, metod i pl bez wzglduna modyfikator dostpu, ale pole nie moe by finalne, a metoda nie moe by abstrakcyjna.

    Powstaj pewne wane pytania. Co si stanie, jeli bdzie wicej ni jedna implementacja interfejsuUserDataRepository? Jak kontener CDI zidentyfikuje implementacj do wstrzyknicia? Aby rozrnikonkretne implementacje interfejsu UserDataRepository, dla konkretnych klas mona oznaczyklas samodzielnie zdefiniowanym kwalifikatorem.

    Wyobra sobie, e s dwie implementacje interfejsu UserDataRepository jedna dla kolekcji

    Mongo DB (dokumentowa baza danych), a druga dla bazy danych MySQL (relacyjna bazadanych). Naleaoby utworzy dwa kwalifikatory (jeden dla implementacji Mongo i drugidla implementacji MySQL) i odpowiednio oznacza nimi konkretne klasy oraz znajdujce siw nich pola.

    Wemy np. klas UserServicez listingu 5.7. Gdybymy chcieli uy implementacji interfejsuUserDataRepositorydla Mongo, dodalibymy adnotacj @Mongodo pola udr:

    @Inject @Mongo

    privateUserDataRepository udr;

    Bardziej szczegowy opis kwalifikatorw znajduje si poniej i w rozdziale 6.

    Adnotacja @Named

    Kolejnym wielkim wydarzeniem byo wprowadzenie adnotacji @Namedw miejscekwalifikatorw acuchowych. Wieloznacznoci w zalenociach EJB rozstrzygano przy uyciuacucha w atrybucie beanNameadnotacji @EJBokrelajcej implementacj do wstrzyknicia @EJB(beanName="UserDataRepository"). Adnotacja @Namedumoliwia rwnie rozstrzyganieniejednoznacznoci przy uyciu atrybutu acuchowego. Na listingu 5.8 implementacja Mongointerfejsu UserDataRepositoryjest wstrzykiwana do pola udr.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    15/30

    Implementacja wstrzykiwania zalenoci w Javie EE 77

    Listing 5.8. Wykorzystanie adnotacji @Named do rozstrzygania wieloznacznoci

    package com.devchronicale.di;

    import javax.inject.Inject;

    import javax.inject.Named;

    class UserService {

    @Inject

    @Named("UserDataRepositoryMongo")

    private UserDataRepository udr;

    public void persistUser(User user) {

    udr.save(user) ;

    }

    }

    Jawna adnotacja implementacji Mongo jest wymagana przez odpowiadajc jej adnotacj @Named.Na listingu 5.9 implementacja Mongo interfejsu UserDataRepositoryjest oznaczona adnotacjz tak sam nazw, jaka zostaa uyta do rozstrzygnicia wieloznacznoci na listingu 5.8.

    Listing 5.9. Konkretna implementacja wymaga adnotacji @Named

    package com.devchronicale.di;

    import javax.inject.Named;

    @Named("UserDataRepositoryMongo")

    public class UserDataRepositoryMongo implements UserDataRepository {

    @Override

    public void save(User user) {

    // zapisywanie danych

    }

    }

    Wykorzystywanie acuchw do identyfikowania zalenoci to technika przestarzaa. Jest onaniebezpieczna dla typw i w specyfikacji CDI JSR 299 odradza si jej stosowanie. Ale da si teuy adnotacji @Namedw taki sposb, aby nie wykorzystywa identyfikatorw acuchowych

    w miejscu wstrzykiwania.@Inject @Named

    private UserDataRepository UserDataRepositoryMongo;

    Na listingu 5.9 nazwa implementacji do wstrzyknicia jest okrelana na podstawie nazwy polaUserDataRepositoryMongo. W rzeczywistoci adnotacja @Namedzostaje zamieniona na@Named("UserDataRepositoryMongo").

    Wstrzykiwanie zalenoci i kontekst (CDI)

    TechnikaCDI(ang. Context and Dependency Injection kontekst i wstrzykiwanie zalenoci) wniosado platformy Java EE kompletny mechanizm wstrzykiwania zalenoci, ktry wczeniej by cilezwizany z EJB i o wiele bardziej ograniczony. Po pojawieniu si EJB 3 w JBoss wprowadzono Seam

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    16/30

    78 ROZDZIA 5. Wstrzykiwanie zalenoci i CDI

    (system szkieletowy do budowy aplikacji sieciowych), ktry zdoby cakiem spor popularnodziki obsudze bezporednich interakcji midzy JSF (ang.JavaServer Faces) i JavaBeans oraz EJB.Sukces systemu Seam doprowadzi do powstania specyfikacji JSR 299 WebBeans. Podobnie jakHibernate, znany system szkieletowy do zapisywania danych dla Javy, by bodcem do standaryzacjiinterfejsu API Java Persistence (JPA), Seam sta si inspiracj rdzenia implementacji CDI.

    CDI wsppracuje z kadym zwykym obiektem Javy (POJO) przez tworzenie i wstrzykiwanieobiektw do innych obiektw. Wstrzykiwa mona nastpujce rodzaje obiektw:

    POJO;

    zasoby biznesowe, np. dane i kolejki;

    zdalne referencje EJB;

    ziarna sesyjne;

    obiekty typu EntityManager;

    referencje do usug sieciowych;

    pola producenckie i obiekty zwracane przez metody producenckie.

    CDI a EJBCho moe si wydawa, e CDI i EJB to technologie konkurencyjne, w rzeczywistoci egzystujone w harmonii. CDI moe dziaa bez kontenera EJB. W istocie CDI moe by podstaw aplikacjidesktopowej lub dowolnej aplikacji sieciowej, ktra nie korzysta z kontenera EJB. CDI dostarczafabryk i wstrzykiwanie do dowolnego ziarna.

    Natomiast ziarna EJB wymagaj kontenera EJB. Nawet uproszczona architektura EJB jest bardziej

    zoona ni obiekty POJO i dlatego ziarna EJB potrzebuj kontenera EJB. Kontener ten zapewniadodatkowe przydatne usugi, takie jak: zabezpieczenia, transakcje i wspbieno.

    Mwic krtko: kontener CDI jest lejszym i potniejszym, ale te mniej funkcjonalnymkontenerem dla obiektw POJO. Jednak oba kontenery s na tyle dobrze ze sob zintegrowane,e adnotacje CDI mog suy jako brama i standardowy interfejs do interakcji z kontenerem EJB.Na przykad adnotacja @Injectmoe by uywana zarwno z POJO, jak i EJB oraz moe wstrzykiwadowoln kombinacj tych obiektw, wywoujc odpowiedni kontener.

    Ziarna CDIZiarno zarzdzane przez kontener to troch wicej ni tylko obiekt POJO speniajcy pewneproste wymagania:

    Musi mie bezargumentowy konstruktor lub konstruktor deklarujcy adnotacj @Inject.

    Klasa musi by konkretna i znajdowa si na najwyszym poziomie hierarchii alboby opatrzona adnotacj @Decorate. Nie moe by to niestatyczna klasa wewntrzna.

    Ziarno nie moe by zdefiniowane jako EJB.

    Jeli ziarno jest zdefiniowane jako zarzdzane przez inn technologi Javy EE, np. JSF,to rwnie bdzie zarzdzane przez ten kontener.

    Obiekty kadej klasy speniajcej te wymagania s tworzone i zarzdzane przez kontener i mogby wstrzykiwane. Nie trzeba adnej specjalnej adnotacji, aby oznaczy klas jako ziarno zarzdzane.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    17/30

    Implementacja wstrzykiwania zalenoci w Javie EE 79

    Kontener szuka ziaren w archiwach ziaren. Wyrnia si dwa typy takich archiww jawnei niejawne. Archiwum jawne zawiera deskryptor wdroenia bean.xml, ktry z reguy pozostajepusty. CDI skanuje klasy w archiwum w poszukiwaniu klas speniajcych opisane powyej wymaganiastawiane ziarnom oraz przejmuje do zarzdzania i wstrzykiwania wszystkie te z nich, ktre niemaj adnotacji @Vetoed. Adnotacja ta wyklucza klas z grupy klas zarzdzanych przez kontener.

    W niektrych przypadkach nie jest podane zezwolenie kontenerowi na zarzdzanie wszystkimiznalezionymi ziarnami, ktre speniaj warunki. Jeli trzeba ograniczy grup klas, ktre zostanprzyjte przez kontener CDI do zarzdzania, mona zdefiniowa wasno bean-discovery-modew deskryptorze wdroenia bean.xml. Na listingu 5.10 pokazano fragment tego pliku zawierajcywasno bean-discovery-modez wartoci all.

    Listing 5.10.Tryb wykrywania ziaren ustawia si w pliku bean.xml

    ...

    Wasnoci bean-discovery-modemona przypisa jedn z trzech wartoci: all, nonelub annotated.Ustawienie alloznacza dla kontenera CDI, e ma zarzdza wszystkimi znalezionymi w archiwumziarnami. Jest to warto domylna. Ustawienie noneoznacza, e kontener CDI ma w ogle niezarzdza ziarnami, a annotatedsprawia, e archiwum zachowuje si jak archiwum niejawne.W takim przypadku kontener szuka ziaren z adnotacjami oznaczajcymi ich zakres.

    Niejawne archiwum ziaren nie zawiera deskryptora wdroenia bean.xml. Stanowi to dla konteneraCDI sygna, e powinien zarzdza tylko ziarnami z okrelonym zakresem. Wicej informacjina temat zakresw ziaren znajduje si w punkcie Konteksty i zakres.

    Adnotacja @InjectWaciwoci adnotacji @Injectzostay ju opisane. Zanim wprowadzono technologi CDI do Javy EE,kady system szkieletowy wstrzykiwania zalenoci dziaa na swj sposb. Kiedy w Javie EEzastosowano kontener CDI, ktry mia pracowa obok kontenera EJB, adnotacja @Injectstaa si

    jedynym i abstrakcyjnym interfejsem dla prawie wszystkich operacji wstrzykiwania. Dziki niejmona uywa kadego kontenera lub systemu szkieletowego wstrzykiwania zalenociodpowiedniego w danym przypadku.

    Konteksty i zakresKontekst jest tym, co odrnia kontenery EJB od CDI. Cykl ycia ziarna CDI jest powizanyz zakresem kontekstowym. Istniej cztery zakresy CDI:

    @RequestScoped zakres obejmuje danie HTTP uytkownika.

    @SessionScoped zakres obejmuje sesj HTTP uytkownika.

    @ApplicationScoped stan jest wspdzielony przez wszystkich uytkownikw w aplikacji.

    @ConversationScoped zakres jest kontrolowany przez programist.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    18/30

    80 ROZDZIA 5. Wstrzykiwanie zalenoci i CDI

    Ziarno opatrzone adnotacj okrelajc zakres przechowuje stan przez cay ten zakres i wspdzieliten stan z kadym klientem dziaajcym w tym samym zakresie. Na przykad ziarno o zakresie daniaprzechowuje stan przez cay czas istnienia dania HTTP, a ziarno o zakresie sesji przechowujestan przez cay czas istnienia sesji HTTP. Ziarno z zakresem jest automatycznie tworzone w raziepotrzeby i niszczone na kocu kontekstu, w ktrym bierze udzia.

    Adnotacje zakresowe s czsto uywane do okrelania zakresu ziaren wykorzystywanychprzez jzyk EL (ang. Expression Language) w faceletach.

    Nazewnictwo i ELZiarno z adnotacj @Namedjest dostpne poprzez jzyk EL. Domylnie w wyraeniu naley uynazwy klasy, tylko zmieni pierwsz liter na ma. W odniesieniach do metod dostpowychzaczynajcych si od przedrostka getlub isnaley opuci t czstk. Na listingu 5.11 pokazanostosowny przykad.

    Listing 5.11. Adnotacja @Named sprawia, e ziarno staje si widoczne dla EL

    package com.devchronicale.di;

    import j avax.enterprise.context.RequestScoped;

    import j avax. inj ect.Named;

    @Named // Defining that this is a managed bean

    @RequestScoped // Defines the scope

    public class User {

    private String fullName;

    public String getFullName() {

    return this .fullName;

    }

    // dalsze metody usunite dla uproszczenia

    }

    Jest to prosta implementacja nazwanego ziarna zwracajcego acuch, gdy zostanie wywoanametoda getFullName(). W facelecie do metody tej naleaoby odnie si za pomoc nazwyuser.fullname.

    Ziarna CDI jako wsparcie dla JSFJak w poprzednim przykadzie, ziarna CDI mog suy jako ziarna wspierajce dla stron JSF.Dostp do nazwanych ziaren mona uzyska poprzez ich nazw z pierwsz liter zmienionna ma. Dostp do pl i metod dostpowych na stronach JSF mona uzyska zgodniez konwencjami Javy. Technologia JSF nie jest tematem tej ksiki, ale na listingu 5.11

    pokazano przykad wykorzystania ziaren CDI z JSF.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    19/30

    Implementacja wstrzykiwania zalenoci w Javie EE 81

    KwalifikatoryW tym podrozdziale opisujemy sposoby tworzenia wasnych klas kwalifikatorw.

    Na listingu 5.12 tworzymy kwalifikator o nazwie Mongo, przy uyciu ktrego mona dodawaadnotacje do pl. Jeli chcesz zastosowa t adnotacj do

    metody,parametru

    lub klasy albointerfejsu (typu), to moesz j doda do adnotacji @Target.

    Listing 5.12.Tworzenie kwalifikatora o nazwie @Mongo

    package com.devchronicale.di;

    import static java.lang.annotation.ElementType. FIELD ;

    import static java.lang.annotation.RetentionPolicy. RUNTIME ;

    import j ava.lang.annotation.Retention;

    import j ava.lang.annotation.Target;

    import j avax. inj ect.Qualifier;

    @Qualifier

    @Retention(RUNTIME)

    @Target({ FIELD} )

    public @interface Mongo {}

    Szerzej na temat rnych zastosowa adnotacji piszemy w rozdziale 6.

    AlternatywyW przedstawionych przykadach pokazalimy, jak za pomoc kwalifikatorw odrni od siebiedwie rne implementacje interfejsu UserDataRepository. Takich wyborw implementacjidokonuje si z reguy w czasie pisania programu, wprowadzajc odpowiednie zmiany w kodzie.Ale w razie potrzeby mona te zrobi to podczas wdraania programu za pomoc adnotacji@Alternativei kilku linijek konfiguracji w deskryptorze wdroenia bean.xml.

    Korzystajc z dotychczasowych przykadw, oznaczymy nasze dwie implementacje interfejsuUserDataRepositoryadnotacj @Alternativeoraz zdefiniujemy odpowiedni konfiguracjw pliku bean.xml. W niej zdecydujemy, ktr implementacj naley wstrzykn.

    @Alternative

    public class UserDataRepositoryMongoimplements UserDataRepository { ... }

    @Alternative

    public class UserDataRepositoryMySQLimplements UserDataRepository { ... }

    Implementacj wykorzystywan w aplikacji deklarujemy w pliku bean.xml:

    com.devchronicale.di.UserDataRepositoryMongo

    Alternatywy czsto s wykorzystywane w fazie testowania programu do tworzenia atrap obiektw.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    20/30

    82 ROZDZIA 5. Wstrzykiwanie zalenoci i CDI

    StereotypyStereotypymona sobie wyobraa jako szablony definiujce cechy typu ziarna. Na przykadziarno wykorzystywane na poziomie modelu w aplikacji zbudowanej wedug wzorcaModel Widok Kontroler (MVC) do dziaania wymaga pewnych adnotacji. Mog to by np. te:

    @Named

    @RequestScoped

    @Stereotype

    @Target({TYPE, METHOD, FIELD})

    @Retention(RUNTIME)

    Do zdefiniowania ziarna modelowego niezbdne s tylko adnotacje @Namedi @RequestScoped.Pozostae s potrzebne do utworzenia adnotacji o nazwie @Model.

    W razie potrzeby do kadego ziarna mona przypisa wszystkie te adnotacje albo monazdefiniowa stereotyp o nazwie @Modeli tylko jego uywa w przypadku ziaren. To drugierozwizanie znacznie upraszcza kod i uatwia jego obsug serwisow.

    Aby utworzy stereotyp, definiuje si now adnotacj i stosuje si wymagane adnotacje,jak pokazano na listingu 5.13.

    Listing 5.13. Adnotacja stereotypowa

    @Named

    @RequestScoped

    @Stereotype

    @Target({TYPE, METHOD, FIELD})

    @Retention(RUNTIME)

    public @interface Model {}

    Kade ziarno z adnotacj @Modelma zakres dania (@RequestScoped) i jest widocznedla EL (@Named). Na szczcie kontener CDI z tym stereotypem zosta ju zdefiniowany.

    Adnotacji stereotypowych najczciej uywa si w kombinacji z adnotacj alternatywndo oznaczania obiektw atrapowych.

    Inne wzorce zwizane z CDITechnologia CDI daa programistom Javy EE wiele nowych moliwoci. Nie jest onatylko prostym systemem szkieletowym wstrzykiwania zalenoci, lecz znacznie uatwia

    implementowanie rnych wzorcw.

    W kolejnych rozdziaach znajduje si szczegowy opis tych wzorcw projektowych.Poniej zamiecilimy krtkie wprowadzenie na zaostrzenie apetytu.

    W rozdziale 7., Wzorzec Dekorator, znajduje si opis wzorca Dekorator. Dekoratory opakowujobiekty docelowe, aby dynamicznie doda nowe obowizki. Kady dekorator mona opakowaw inny dekorator, co teoretycznie umoliwia utworzenie nieskoczonej liczby dekorowanychobiektw docelowych w czasie dziaania programu. Wzorzec Dekorator wykorzystuje adnotacje@Decoratori @Delegate. Kolejno dekorowania okrela si w pliku bean.xml.

    W rozdziale 6. opisany jest wzorzec Fabryka. Fabryki ograniczaj do minimum wykorzystanie

    sowa kluczowego newi mog zawiera proces inicjacji oraz rne konkretne implementacje.Wzorzec Fabryka wykorzystuje adnotacj @Producesdo oznaczania metod producenckich.Obiekt docelowy moe wstrzykn lub obserwowa wyprodukowane obiekty.

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    21/30

    Podsumowanie 83

    W rozdziale 11. znajduje si opis wzorca Obserwator i zdarze. Wzorzec ten zmienia kierunekprzepywu wiadomoci, czyli kolejno wywoujcego i wywoywanego. Przy uyciu tego wzorcanie trzeba agresywnie sprawdza zasobu, tylko mona subskrybowa zmiany zachodzce w zasobie.Wzorzec Obserwator w Javie EE wykorzystuje adnotacj @Observesi zdarzenia. Obserwatorydocelowe mog obserwowa wszystkie zdarzenia.

    Tematem rozdziau 8. s aspekty i interceptory. Przy ich uyciu mona zmieni sposbwykonywania kodu w czasie dziaania programu. Kady aspekt lub interceptor moe zatrzymawykonywanie i wczy si w wybranym miejscu. Umoliwia to dynamiczne wprowadzanie zmiannawet w duych programach.

    PodsumowanieW tym rozdziale przedstawilimy techniki wstrzykiwania zalenoci w Javie EE. Koncepcja ta

    umoliwia rozlunienie wizi midzy skadnikami systemu atwiej, ni mona by si byo spodziewa.Pokazalimy, jak wstrzykiwanie zalenoci umoliwia pozbycie si sowa kluczowego new, a wicuniknicie rcznego tworzenia obiektw.

    Sporo miejsca powicilimy te technologii CDI, ktra dziki wykorzystaniu nowego kontenerastwarza cakiem nowe moliwoci. Przy jej uyciu wstrzykiwanie zalenoci mona stosowado wszystkich obiektw, a implementacja innych wzorcw opisanych w tej ksice jest znacznieatwiejsza.

    WICZENIA

    1.

    Zaprojektuj klas usugow zwracajc do klienta dowolny acuch.

    2.

    Zaimplementuj czytnik plikw i wstrzyknij go do wczeniej utworzonej usugi.

    3.

    Zaimplementuj obiekt odczytujcy jako acuch tre HTML z okrelonego na stae adresu URL.

    4.

    Zastanw si, co musisz zmieni w klasie usugowej, aby mc wstrzykiwa obu dostawcwdanych przy uyciu tej samej referencji.

    5.

    Czy da si dynamicznie wstrzykn wybran implementacj w zalenoci od pewnychwarunkw? Na przykad czy mona sprawi, aby czytnik plikw by wstrzykiwany podczas

    pracy nad programem, a czytnik HTTP w produkcji?

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    22/30

    84 ROZDZIA 5. Wstrzykiwanie zalenoci i CDI

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    23/30

    Skorowidz

    Aabstrakcyjny dekorator, 107adnotacja, 37

    @DependsOn, 65@GeneratedValue, 176@Inject, 76, 79, 94@Interceptor, 124@Interceptors, 124@Lock, 67

    @MessageEvent, 166@Named, 7680, 96, 207@Observes, 166@Path, 193@Produce, 101@RequestScope, 207@Schedule, 150, 156@Secure, 129@Timeout, 151, 156@Transient, 176stereotypowa, 82

    agencja informacyjna, 162alternatywy, 81antywzorce, 35, 220AOP, aspect-oriented programming, 117API JPA, 174architektura

    Lazani, 221mikrousugowa, 215, 219monolityczna, 215, 216, 220wielowarstwowa, 38

    aspekty, 122asynchroniczne

    serwlety, 140ziarna, 138

    asynchroniczno, 133

    B

    baza danych typu NoSQL, 171bezpieczestwo, 32

    bezstanowo, 184

    C

    CDI, Context and Dependency Injection, 34, 43, 71, 77CMP, Container-Managed Persistence, 174cykl ycia interceptora, 125czasomierz, 155

    automatyczny, 150programowy, 151

    czas dostpu wspbienego, 68

    D

    DAO, data access object, 172definicja filtru serwletu, 121dekompozycja na usugi, 218dekorator

    BlackFridayDiscountDecorator, 111dodajcy dodatki, 107PriceDiscountDecorator, 110

    dekoratory bez konfiguracji XML, 113dekorowanie, 109delegacja, 143

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    24/30

    232JAVA EE. ZAAWANSOWANE WZORCE PROJEKTOWE

    DI, Dependency Injection, 71diagram klas

    dziedziczenie, 28wzorca

    Dekorator, 105

    Dostpu do Danych, 172Fabryka Abstrakcyjna, 90Fasady, 51Obserwator, 162Singleton, 59

    diagram wzorca Model Widok Kontroler, 201dugotrwae sondowanie, 212dokument JSR, 41dostp wspbieny do singletonu, 68DTO, data transfer object, 172, 200

    E

    EJB, 78EJB, Enterprise JavaBeans, 41EL, 80encja, entity, 174

    F

    fabryka, 85

    Abstrakcyjna, 85, 89DAO, 177

    facelety, 206filtr serwletu, 120format JSON, 191

    G

    gniazda sieciowe, 212

    HHATEOAS, 182, 194

    I

    idempotencja, 187implementacja

    @Secure, 129AOP, 120asynchronicznoci, 136

    automatycznego czasomierza, 151bezstanowej fasady, 54CoffeMachine, 88

    czasomierza programowego, 152czasomierza w Javie EE, 150DAO, 179fabryki, 99Fabryki Abstrakcyjnej, 90

    filtru serwletu, 121interceptora, 122interceptorw klasowych, 123interfejsu AbstractDrinksMachineFactory, 91interfejsu DAO, 177, 179interfejsu UserDataRepository, 73LongMessage, 98Metody Fabrycznej, 88, 91publikacja-subskrypcja, 215punkt do punktu, 214

    rady docelowej, 123REST w Javie EE, 191REST-owego interfejsu API, 191ShortMessage, 98SoftDrinksMachine, 88wstrzykiwania zalenoci, 72wstrzykiwania zalenoci w Javie EE, 75wzorca

    DAO w Javie EE, 174Dekorator, 106Dekorator w Javie EE, 109Fabryka w Javie EE, 91Fasada, 52Fasada w Javie EE, 53MVC, 202, 206, 207MVC w Javie EE, 206Obserwator, 162Obserwator w Javie EE, 164Singleton, 59, 62Singleton w Javie EE, 63

    wzorcw projektowych, 47

    informacjeo kontekcie, 124o wzorcu DAO, 173

    interceptor, 44, 117, 122, 125interceptor dziennika, 45interceptory

    CDI, 128na poziomie domylnym, 125

    interfejsAbstractDrinksMachineFactory, 91

    API, 197DAO, 176dla fabryki abstrakcyjnej, 90

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    25/30

    Skorowidz233

    kwalifikacyjny adnotacji, 166MessageType, 98Observable, 164Order, 106Product, 109

    Publisher, 163Serializable, 176Timer, 150TimerService, 151, 152UserDataRepository, 73

    J

    J2EE, 31Java SE, Java Standard Edition, 31

    jednostka utrwalania, 178JPA, Java Persistence API, 174JPE, 31JSF, 80JSR, Java Specification Request, 41

    K

    klasaakcji, 205DrinksMachine, 88

    encyjna, 175fabryczna, 204ListUserAction, 206Observable, 164User, 73UserService, 7376, 203UserServiceFactory, 74

    klient-serwer, 183kolejka, 214kolejno

    interceptorw, 126uruchamiania, 65komponent sieciowy, 40konfiguracja serwletu facesservlet, 206konteksty, 44, 77, 79kontener CDI, 97, 101kontroler, 200konwencja, 43kwalifikator, 81, 95

    LongMessage, 94niestandardowy, 112ShortMessage, 94

    L

    LDAP, Lightweight Directory Access Protocol, 171litera adnotacyjny, 99

    Mmapowanie obiektowo-relacyjne, ORM, 174metoda

    DELETE, 188GET, 187executeTask, 150Fabryczna, 85, 86GET, 194getInfo, 150getNextTimeout, 153getThirdChild, 168isCalendarTimer, 153POST, 188, 194PUT, 188serviceTrace, 165setRollbackOnly, 169setTimer, 151startAsync(), 141startService, 165

    metody HTTP, 187

    mikrousugi, 219model

    dojrzaoci Richardsona, 185komponentowy, 42programowania J2EE, 227

    modyfikowanie czasomierza, 155MVC, model-view-controller, 199MVP, model, view, presenter, 202

    N

    nazewnictwo, 80nazewnictwo zasobw, 186niejednoznaczno, 95niestandardowa adnotacja wiadomoci, 99niestandardowy typ adnotacji, 95

    O

    obiektdostpu do danych, DAO, 172

    DTO, 173JSON, 192transferu danych, DTO, 172

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    26/30

    234JAVA EE. ZAAWANSOWANE WZORCE PROJEKTOWE

    obiekttypu ManagedThreadFactory, 142typu ScheduleExpression, 153

    obserwator, observer, 160RadioChannel, 163

    zdarze transakcji, 167obserwowalne ziarno usugowe, 164odbiornik, listener, 161odmierzanie czasu, 147okrelanie kolejnoci uruchamiania, 65, 66operacje CRUD, 172ORM, Object-Relational Mapping, 174

    P

    plik persistence.xml, 178pliki EJB-JAR, 126pobieranie informacji, 124podczanie faz cyklu ycia, 125podmiot, 160POJO, 37profil sieciowy Javy EE, 42programowanie

    aspektowe, AOP, 117asynchroniczne, 133, 138

    przekazywanie wiadomoci, 214

    przenono, 32publikacja-subskrypcja, 215punkt

    do punktu, 214kocowy, 212kocowy z adnotacjami, 213

    R

    repozytorium LDAP, 171

    REST, 181, 182bezstanowo, 184jednolity interfejs, 184klient-serwer, 183kod na danie, 184nazewnictwo zasobw, 186posts, 189system warstwowy, 184topics, 189users, 188zapisywanie danych w buforze, 184

    REST-owy interfejs API, 185, 188rozrnianie ziaren, 96

    rozstrzyganieniejednoznacznoci, 95, 96wieloznacznoci, 77

    rozwizania dla biznesu, 31

    Sschemat implementacji MVC, 202serwer Java EE, 41serwlet, 140serwlet FacesServlet, 206skalowalno, 217SOA, Service Oriented Architecture, 33, 215, 228stereotypy, 82synchronizacja singletonu, 60

    system szkieletowy, 222szecian AKF, 217

    T

    technika CDI, 77technologia J2EE, 32tematy, topics, 189, 214transakcje, 32, 156tworzenie

    obiektu singletonowego, 60, 61

    uytkownika, 189typ wyliczeniowy, 62typy wzorca MVC, 201

    U

    Uberklasa, 220users, 188usuga odmierzania czasu, 147usugi sieciowe, 181

    uytkownicy, users, 188uywanieinterceptorw, 130programowania asynchronicznego, 143REST, 196wzorca DAO, 180wzorca Dekorator, 114wzorca Fasada, 55wzorca MVC, 208wzorca Obserwator, 169wzorca Singleton, 69

    wzorcw, 227wzorcw fabrycznych, 100

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    27/30

    Skorowidz235

    W

    warstwaEIS, 40kliencka, 39

    logiki biznesowej, 40porednia, 214

    warunki REST, 183wizanie interceptora, 129widok, 200widok renderujcy dane, 208wpisy, posts, 189wspbieno, 67wstrzykiwanie

    acucha, 92

    zalenoci, 44, 77zalenoci, DI, 71ziaren, 94, 96

    wyjtek IndexOutOfBounds, 168wykorzystywanie singletonw, 64wykrywanie ziaren, 79wyczanie interceptorw, 128wyraenia

    czasowe, 153kalendarzowe, 154

    wywoywanie singletonu, 64

    wzorcebehawioralne, 30biznesowe, 33konstrukcyjne, 30strukturalne, 30zwizane z CDI, 82

    wzorzecAsynchroniczno, 134Dekorator, 103Dostp do Danych, 171, 172Fabryka, 85

    Fasada, 49Model Widok Kontroler, 199MVC, 200Obiekt Transferu Danych, 173Obserwator, 159projektowy, 28Singleton, 57

    Z

    zakres, 79zalety architektury mikrousugowej, 218zarzdzanie wspbienoci, 67zasada Hollywood, 160zasady Javy EE, 42zdarzenie transakcji, 167ziarna

    asynchroniczne, 138bezstanowe, 53CDI, 78, 80obserwatora, 165singletonowe, 63stanowe, 55usugowe, 164wiadomoci, 93wspierajce, 206

    ziarno, 38encyjne, entity bean, 174MessageA, 92MessageB, 93

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    28/30

    236JAVA EE. ZAAWANSOWANE WZORCE PROJEKTOWE

    Pole ksikKup ksik

    http://helion.pl/rf/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rt/javeezhttp://helion.pl/rf/javeez
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    29/30

    http://program-partnerski.helion.pl/
  • 7/24/2019 Java EE. Zaawansowane wzorce projektowe

    30/30