40

Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio
Page 2: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Tytuł oryginału: Spring in Action, 5th Edition

Tłumaczenie: Robert Górczyński

ISBN: 978-83-283-5606-1

Projekt okładki: Studio Gravite / Olsztyn; Obarek, Pokoński, Pazdrijowski, ZapruckiMateriały graficzne na okładce zostały wykorzystane za zgodą Shutterstock Images LLC.

Original edition copyright © 2019 by Manning Publications Co.All rights reserved.

Polish edition copyright © 2019 by Helion SAAll 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 Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletnei rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą równieżżadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Helion SAul. Kościuszki 1c, 44-100 Gliwicetel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: 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/sprwa5.zip

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/sprwa5Moż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ść

Page 3: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Spis treściWprowadzenie 13Podziękowania 15O książce 17

CZĘŚĆ I. PODSTAWY SPRINGA 21

Rozdział 1. Rozpoczęcie pracy ze Springiem 231.1. Czym jest Spring? 241.2. Inicjalizacja aplikacji Springa 26

1.2.1. Inicjalizacja projektu Springa za pomocą Spring Tool Suite 271.2.2. Analiza struktury projektu Springa 30

1.3. Utworzenie aplikacji Springa 371.3.1. Obsługa żądań internetowych 371.3.2. Definiowanie widoku 391.3.3. Testowanie kontrolera 401.3.4. Kompilacja i uruchomienie aplikacji 411.3.5. Poznajemy Spring Boot DevTools 431.3.6. Przegląd 45

1.4. Możliwości Springa 461.4.1. Podstawowy framework Spring 471.4.2. Spring Boot 471.4.3. Spring Data 481.4.4. Spring Security 481.4.5. Spring Integration i Spring Batch 481.4.6. Spring Cloud 48

Podsumowanie 49

Rozdział 2. Tworzenie aplikacji internetowej 512.1. Wyświetlanie informacji 52

2.1.1. Zdefiniowanie domeny 522.1.2. Utworzenie klasy kontrolera 552.1.3. Przygotowanie widoku 58

2.2. Przetwarzanie wysłanego formularza 622.3. Weryfikacja danych wyjściowych formularza 68

2.3.1. Deklarowanie reguł weryfikacji danych 682.3.2. Przeprowadzanie weryfikacji danych podczas ich pobierania z formularza 702.3.3. Wyświetlanie błędów operacji sprawdzania poprawności danych 72

2.4. Praca z kontrolerem widoku 722.5. Wybór biblioteki szablonów widoku 75

2.5.1. Buforowanie szablonów 77Podsumowanie 78

Poleć książkęKup książkę

Page 4: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

6 Spis treści

Rozdział 3. Praca z danymi 793.1. Odczyt i zapis danych za pomocą JDBC 79

3.1.1. Przygotowanie domeny do obsługi trwałego magazynu danych 823.1.2. Praca z klasą JdbcTemplate 833.1.3. Definiowanie schematu i wstępne przygotowanie danych 873.1.4. Wstawianie danych 89

3.2. Implementacja trwałego magazynu danych za pomocą Spring Data JPA 983.2.1. Dodawanie Spring Data JPA do projektu 993.2.2. Określenie domeny jako encji 993.2.3. Deklarowanie repozytoriów JPA 1023.2.4. Dostosowanie do własnych potrzeb repozytoriów JPA 104

Podsumowanie 106

Rozdział 4. Spring Security 1074.1. Włączenie obsługi Spring Security 1084.2. Konfigurowanie Spring Security 110

4.2.1. Istniejący w pamięci magazyn danych użytkownika 1114.2.2. Magazyn danych użytkownika oparty na JDBC 1124.2.3. Magazyn danych użytkownika oparty na LDAP 1154.2.4. Dostosowanie uwierzytelniania użytkownika do własnych potrzeb 118

4.3. Zabezpieczanie żądań internetowych 1254.3.1. Zabezpieczanie żądań 1264.3.2. Utworzenie własnej strony logowania 1294.3.3. Wylogowanie 1314.3.4. Ochrona przed atakami typu CSRF 131

4.4. Poznanie użytkownika 133Podsumowanie 135

Rozdział 5. Praca z właściwościami konfiguracyjnymi 1375.1. Dostosowanie konfiguracji automatycznej do własnych potrzeb 138

5.1.1. Poznajemy abstrakcję środowiska Springa 1395.1.2. Konfigurowanie źródła danych 1405.1.3. Konfigurowanie serwera osadzonego 1425.1.4. Konfigurowanie rejestrowania danych 1435.1.5. Używanie wartości właściwości specjalnych 144

5.2. Tworzenie własnych właściwości konfiguracyjnych 1455.2.1. Definiowanie komponentów przechowujących właściwości konfiguracyjne 1475.2.2. Deklarowanie metadanych właściwości konfiguracyjnej 149

5.3. Konfigurowanie za pomocą profili 1525.3.1. Definiowanie właściwości dla konkretnego profilu 1535.3.2. Aktywowanie profilu 1545.3.3. Warunkowe tworzenie komponentu bean z profilami 155

Podsumowanie 156

Poleć książkęKup książkę

Page 5: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Spis treści 7

CZĘŚĆ II. ZINTEGROWANY SPRING 157

Rozdział 6. Praca z właściwościami konfiguracyjnymi 1596.1. Utworzenie kontrolerów RESTful 160

6.1.1. Pobieranie danych z serwera 1626.1.2. Przekazywanie danych do serwera 1676.1.3. Uaktualnienie danych w serwerze 1686.1.4. Usuwanie danych z serwera 170

6.2. Włączenie obsługi hipermediów 1716.2.1. Dodawanie hiperłączy 1746.2.2. Utworzenie komponentu asemblera zasobu 1766.2.3. Nazewnictwo osadzonych związków 180

6.3. Włączenie usług back-endu 1816.3.1. Dostosowanie nazw ścieżek dostępu zasobów i relacji 1846.3.2. Stronicowanie i sortowanie 1866.3.3. Dodawanie własnych punktów końcowych 1876.3.4. Dodawanie własnych hiperłączy do punktów końcowych Spring Data 189

Podsumowanie 190

Rozdział 7. Używanie usług REST 1917.1. Używanie punktów końcowych REST za pomocą RestTemplate 192

7.1.1. Pobieranie zasobu 1947.1.2. Przekazywanie do serwera zasobów za pomocą metody HTTP PUT 1957.1.3. Usuwanie zasobu 1967.1.4. Przekazywanie do serwera zasobów za pomocą metody HTTP POST 196

7.2. Poruszanie się po API REST za pomocą Traverson 197Podsumowanie 199

Rozdział 8. Asynchroniczne wysyłanie komunikatów 2018.1. Wysyłanie komunikatów za pomocą JMS 202

8.1.1. Konfigurowanie JMS 2028.1.2. Wysyłanie komunikatów za pomocą JmsTemplate 2048.1.3. Otrzymywanie komunikatów JMS 211

8.2. Praca z RabbitMQ i AMQP 2158.2.1. Dodawanie obsługi brokera RabbitMQ do Springa 2168.2.2. Wysyłanie komunikatów za pomocą RabbitTemplate 2178.2.3. Pobieranie komunikatu z RabbitMQ 221

8.3. Obsługa komunikatów za pomocą Apache Kafki 2258.3.1. Konfigurowanie Springa do obsługi komunikatów Kafki 2268.3.2. Wysyłanie komunikatów za pomocą KafkaTemplate 2278.3.3. Utworzenie komponentu nasłuchującego Kafki 229

Podsumowanie 231

Rozdział 9. Integracja Springa 2339.1. Deklarowanie prostego przepływu integracji 234

9.1.1. Definiowanie przepływu integracji za pomocą XML-a 2359.1.2. Konfigurowanie przepływu integracji za pomocą Javy 2379.1.3. Konfigurowanie Spring Integration za pomocą języka specjalizowanego 239

Poleć książkęKup książkę

Page 6: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

8 Spis treści

9.2. Poznajemy Spring Integration 2419.2.1. Kanał komunikatu 2419.2.2. Filtr 2439.2.3. Przekształcenie 2449.2.4. Router 2459.2.5. Spliter 2479.2.6. Aktywator usługi 2499.2.7. Brama 2519.2.8. Adapter kanału 2529.2.9. Moduł punktu końcowego 254

9.3. Utworzenie własnego przepływu integracji dotyczącego poczty elektronicznej 256Podsumowanie 261

CZĘŚĆ III. REAKTYWNY SPRING 263

Rozdział 10. Wprowadzenie do projektu Reactor 26510.1. Wprowadzenie do programowania reaktywnego 266

10.1.1. Definiowanie strumienia reaktywnego 26710.2. Rozpoczęcie pracy z projektem Reactor 269

10.2.1. Wykres przepływu reaktywnego 27010.2.2. Dodawanie zależności projektu Reactor 271

10.3. Najczęściej stosowane operacje reaktywne 27210.3.1. Tworzenie typu reaktywnego 27310.3.2. Łączenie typów reaktywnych 27710.3.3. Przekształcanie i filtrowanie strumienia reaktywnego 28110.3.4. Przeprowadzanie operacji logicznej na typie reaktywnym 290

Podsumowanie 292

Rozdział 11. Tworzenie reaktywnego API 29311.1. Praca z frameworkiem WebFlux w Springu 293

11.1.1. Wprowadzenie do Spring WebFlux 29511.1.2. Definiowanie kontrolera reaktywnego 296

11.2. Definiowanie funkcyjnych procedur obsługi żądania 30011.3. Testowanie kontrolera reaktywnego 303

11.3.1. Testowanie żądań HTTP GET 30311.3.2. Testowanie żądań POST 30611.3.3. Testowanie działającego serwera 307

11.4. Reaktywne używanie API REST 30811.4.1. Pobieranie zasobów 30911.4.2. Przekazywanie zasobu 31111.4.3. Usunięcie zasobu 31211.4.4. Obsługa błędów 31211.4.5. Wymiana żądań 314

11.5. Zabezpieczanie API reaktywnego 31611.5.1. Konfigurowanie zabezpieczeń reaktywnej aplikacji internetowej 31611.5.2. Konfigurowanie reaktywnej usługi szczegółów związanych z użytkownikiem 318

Podsumowanie 319

Poleć książkęKup książkę

Page 7: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Spis treści 9

Rozdział 12. Reaktywny trwały magazyn danych 32112.1. Reaktywność i Spring Data 322

12.1.1. Reaktywny Spring Data 32312.1.2. Konwersja między typem reaktywnym a niereaktywnym 32312.1.3. Opracowanie repozytorium reaktywnego 325

12.2. Praca z reaktywnymi repozytoriami bazy danych Cassandra 32512.2.1. Włączenie obsługi Spring Data Cassandra 32612.2.2. Modelowanie danych w bazie danych Cassandra 32812.2.3. Mapowanie typów domeny pod kątem przechowywania informacji

w bazie danych Cassandra 32912.2.4. Tworzenie reaktywnego repozytorium bazy danych Cassandra 335

12.3. Tworzenie reaktywnych repozytoriów MongoDB 33712.3.1. Dodawanie obsługi Spring Data MongoDB 33812.3.2. Mapowanie typu domeny na dokument MongoDB 33912.3.3. Tworzenie interfejsów repozytoriów reaktywnych MongoDB 343

Podsumowanie 345

CZĘŚĆ IV. NATYWNA CHMURA SPRINGA 347

Rozdział 13. Odkrywanie usług 34913.1. Poznajemy mikrousługi 35013.2. Konfiguracja rejestru usług 352

13.2.1. Konfigurowanie Eureki 35613.2.2. Skalowanie serwera Eureka 359

13.3. Rejestrowanie i odkrywanie usług 36113.3.1. Konfigurowanie właściwości klienta Eureki 36213.3.2. Używanie usługi 363

Podsumowanie 368

Rozdział 14. Zarządzanie konfiguracją 37114.1. Konfiguracja współdzielona 37214.2. Uruchamianie serwera konfiguracji 373

14.2.1. Włączanie Config Server 37414.2.2. Umieszczanie właściwości w repozytorium konfiguracyjnym 377

14.3. Używanie konfiguracji współdzielonej 38014.4. Udostępnienie konfiguracji przeznaczonej

dla konkretnej aplikacji i konkretnego profilu 38214.4.1. Udostępnianie właściwości przeznaczonych dla konkretnej aplikacji 38214.4.2. Udostępnianie właściwości z profili 383

14.5. Utajnienie właściwości konfiguracyjnych 38514.5.1. Szyfrowanie właściwości w repozytorium Git 38614.5.2. Przechowywanie danych wrażliwych w magazynie Vault 389

14.6. Odświeżanie właściwości konfiguracyjnych w locie 39314.6.1. Ręczne odświeżanie właściwości konfiguracyjnych 39414.6.2. Automatyczne odświeżanie właściwości konfiguracyjnych 396

Podsumowanie 404

Poleć książkęKup książkę

Page 8: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

10 Spis treści

Rozdział 15. Obsługa awarii i opóźnień 40515.1. Wprowadzenie do wzorca bezpiecznika 40515.2. Deklarowanie bezpiecznika 408

15.2.1. Łagodzenie opóźnienia 41015.2.2. Zarządzanie wartością graniczną bezpiecznika 411

15.3. Monitorowanie awarii 41215.3.1. Wprowadzenie do panelu kontrolnego biblioteki Hystrix 41315.3.2. Pula wątków biblioteki Hystrix 416

15.4. Agregowanie wielu strumieni biblioteki Hystrix 418Podsumowanie 419

CZĘŚĆ V. WDRAŻANIE APLIKACJI SPRINGA 421

Rozdział 16. Praca ze Spring Boot Actuator 42316.1. Wprowadzenie do Actuatora 424

16.1.1. Konfigurowanie bazowej ścieżki dostępu Actuatora 42516.1.2. Włączanie i wyłączanie punktów końcowych Actuatora 426

16.2. Używanie punktów końcowych Actuatora 42716.2.1. Pobieranie podstawowych informacji o aplikacji 42816.2.2. Wyświetlanie konfiguracji aplikacji 43116.2.3. Wyświetlanie informacji o aktywności aplikacji 43916.2.4. Dane statystyczne dotyczące środowiska uruchomieniowego 442

16.3. Dostosowanie Actuatora do własnych potrzeb 44416.3.1. Dodawanie informacji dostarczanych

później przez punkt końcowy /info 44516.3.2. Definiowanie własnych wskaźników informacji o stanie aplikacji 44916.3.3. Rejestrowanie niestandardowych danych statystycznych 45016.3.4. Tworzenie własnego punktu końcowego 452

16.4. Zabezpieczanie Actuatora 455Podsumowanie 457

Rozdział 17. Administrowanie Springiem 45917.1. Używanie Spring Boot Admin 459

17.1.1. Tworzenie serwera administracyjnego 46017.1.2. Rejestrowanie klientów serwera administracyjnego 462

17.2. Poznajemy serwer administracyjny 46517.2.1. Wyświetlanie ogólnych informacji o stanie aplikacji 46617.2.2. Obserwowanie kluczowych danych statystycznych 46617.2.3. Analiza zmiennych środowiskowych 46717.2.4. Wyświetlanie i zmiana poziomu rejestrowania danych 46917.2.5. Monitorowanie wątków 46917.2.6. Monitorowanie żądań HTTP 470

17.3. Zabezpieczanie serwera administracyjnego 47117.3.1. Włączanie logowania w serwerze administracyjnym 47217.3.2. Uwierzytelnianie z użyciem Actuatora 473

Podsumowanie 474

Poleć książkęKup książkę

Page 9: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Spis treści 11

Rozdział 18. Monitorowanie Springa za pomocą JMX 47518.1. Praca z Actuatorem i MBean 47618.2. Tworzenie własnego komponentu MBean 47818.3. Wysyłanie powiadomień 480Podsumowanie 481

Rozdział 19. Wdrażanie aplikacji Springa 48319.1. Opcje podczas wdrażania aplikacji 48419.2. Kompilowanie i wdrażanie pliku WAR 48519.3. Przekazanie pliku JAR do Cloud Foundry 48719.4. Umieszczanie aplikacji Spring Boota w kontenerze Dockera 49019.5. To nie koniec, ale dopiero początek 494Podsumowanie 494

DODATKI 495

Dodatek A. Tworzenie aplikacji Springa 497A.1. Inicjalizacja projektu za pomocą Spring Tool Suite 497A.2. Tworzenie projektu za pomocą IntelliJ IDEA 500A.3. Tworzenie projektu za pomocą NetBeans 503A.4. Inicjalizacja projektu na stronie start.spring.io 506A.5. Inicjalizacja projektu z poziomu powłoki 510

A.5.1. Polecenie curl i API Initializr 510A.5.2. Interfejs powłoki dla Spring Boota 512

A.6. Tworzenie aplikacji Springa za pomocą metaframeworka 513A.7. Kompilowanie i uruchamianie projektu 513

Skorowidz 515

Poleć książkęKup książkę

Page 10: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

12 Spis treści

Poleć książkęKup książkę

Page 11: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Praca z właściwościamikonfiguracyjnymi

W tym rozdziale:

dostosowanie skonfigurowanych automatyczniekomponentów bean;

zastosowanie właściwości konfiguracyjnych dlakomponentów aplikacji;

praca z profilami Springa.

Czy pamiętasz, jak pojawił się pierwszy iPhone? Niewielka metalowa płytka ze szkłemz trudem wpisywała się w to, co dotychczas było uznawane za telefon. Mimo tegoiPhone był pionierem ery smartfonów i zmienił właściwie wszystko w zakresie komuni-kacji. Wprawdzie telefon z ekranem dotykowym jest pod wieloma względami łatwiejszyw obsłudze i oferuje znacznie potężniejsze możliwości od poprzedników, ale po po-jawieniu się iPhone’a trudno było sobie wyobrazić, jak urządzenie zawierające tylkojeden przycisk może być używane do wykonywania połączeń.

Pod pewnymi względami konfiguracja automatyczna Spring Boota działa w takiwłaśnie sposób i znacznie ułatwia tworzenie aplikacji Springa. Jednak po dekadziedefiniowania wartości właściwości w konfiguracji Spring XML i wywoływania metodw egzemplarzach komponentów bean nie od razu będzie jasne, jak należy definiowaćwłaściwości komponentów bean, dla których nie istnieje wyraźnie przygotowanakonfiguracja.

Poleć książkęKup książkę

Page 12: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

138 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

Na szczęście Spring Boot dostarcza rozwiązanie w postaci właściwości konfigura-cyjnych. To po prostu właściwości w komponencie bean kontekstu aplikacji Springa,które mogą być definiowane na podstawie jednego z wielu źródeł właściwości, m.in.:systemu JVM, argumentów powłoki i zmiennych środowiskowych.

W tym rozdziale nie będziesz zajmować się implementacją nowych funkcji apli-kacji Taco Cloud, a zamiast tego poznasz właściwości konfiguracyjne. Zdobyta tutajwiedza bez wątpienia będzie użyteczna w trakcie lektury kolejnych rozdziałów. Na po-czątek zobaczysz, jak wykorzystać właściwości konfiguracyjne do dostosowania usta-wień zdefiniowanych już przez konfigurację automatyczną Spring Boota.

5.1. Dostosowanie konfiguracji automatycznejdo własnych potrzeb

Zanim zagłębisz się we właściwości konfiguracyjne, musisz dowiedzieć się o istnieniudwóch odmiennych (choć powiązanych ze sobą) rodzajów konfiguracji w Springu.

Łączenie komponentów bean — konfiguracja deklarująca utworzenie komponen-tów aplikacji jako komponentów bean w kontekście aplikacji Springa, a takżeokreślenie sposobu ich wstrzykiwania do siebie nawzajem.

Wstrzyknięcie właściwości — konfiguracja przypisująca wartości komponen-tom bean w kontekście aplikacji Springa.

W konfiguracji Spring XML i opartej na Javie te dwa rodzaje konfiguracji są bardzoczęsto zadeklarowane w tym samym miejscu. W konfiguracji Javy metoda oznaczonaadnotacją @Bean prawdopodobnie powoduje utworzenie egzemplarza komponentubean, a następnie przypisanie wartości jego właściwościom. Rozważ przedstawionąw kolejnym fragmencie kodu metodę z adnotacją @Bean deklarującą źródło danych dlaosadzonej bazy danych H2.

@Beanpublic DataSource dataSource() { return new EmbeddedDataSourceBuilder() .setType(H2) .addScript("taco_schema.sql") .addScripts("user_data.sql", "ingredient_data.sql") .build();}

W tym przykładzie metody addScript() i addScripts() definiują pewne właściwości typuciągu tekstowego z nazwami skryptów SQL, które powinny zostać wykonane w baziedanych, gdy źródło danych będzie gotowe. Wprawdzie w taki sposób możesz konfi-gurować komponent bean źródła danych, jeśli nie używasz Spring Boota, ale konfigu-racja automatyczna powoduje, że ta metoda jest zupełnie zbędna.

Jeżeli zależność H2 jest dostępna w ścieżce dostępu klas w trakcie działania aplika-cji, wówczas Spring Boot w kontekście aplikacji Springa automatycznie tworzy odpo-wiedni komponent bean DataSource. Ten komponent następnie stosuje skrypty SQLschema.sql i data.sql.

Poleć książkęKup książkę

Page 13: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

5.1. Dostosowanie konfiguracji automatycznej do własnych potrzeb 139

Co w sytuacji, jeśli tym skryptom SQL chcesz nadać inne nazwy lub jeśli chceszskorzystać z więcej niż tylko dwóch skryptów SQL? W takim przypadku do gry wcho-dzą właściwości konfiguracyjne. Jednak zanim przystąpisz do ich używania, najpierwpowinieneś się dowiedzieć, skąd one pochodzą.

5.1.1. Poznajemy abstrakcję środowiska Springa

Abstrakcja środowiska Springa to miejsce dla wszystkich właściwości konfiguracyjnych.Jest to źródło właściwości, więc jeśli będą one wymagane przez komponent bean,wówczas mogą pochodzić z samego Springa. Środowisko Springa zawiera wiele źró-deł właściwości, m.in.:

właściwości systemu JVM, zmienne środowiskowe systemu operacyjnego, argumenty powłoki, pliki konfiguracyjne aplikacji.

Następnie te właściwości są agregowane w pojedynczym źródle, z którego mogą byćwstrzykiwane do komponentów bean. Na rysunku 5.1 pokazałem, jak właściwości po-chodzące z różnych źródeł przechodzą przez abstrakcję środowiska Springa i trafiajądo komponentów bean.

Rysunek 5.1. Środowisko Springa pobiera właściwości z różnych źródeł, a następnieudostępnia je komponentom bean w kontekście aplikacji Springa

Komponenty bean konfigurowane automatycznie przez Spring Boota zostają skonfi-gurowane za pomocą właściwości pobranych ze środowiska Springa. Oto prosty przy-kład. Przyjmuję założenie, że chcesz, aby serwlet kontenera nasłuchiwał żądań naporcie innym niż domyślny 8080. Wymaga to podania innego numeru portu we wła-ściwości server.port zdefiniowanej w pliku src/main/resources/application.properties:

server.port=9090

Poleć książkęKup książkę

Page 14: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

140 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

Podczas przypisywania wartości właściwościom preferuję używanie formatu YAML.Dlatego też do zdefiniowania wartości server.port można zamiast pliku application.properties użyć pliku src/main/resources/application.yml:

server: port: 9090

Jeżeli wolisz zewnętrzne konfigurowanie właściwości, wówczas numer portu możeszzdefiniować podczas uruchamiania aplikacji, używając do tego argumentu powłoki:

$ java -jar tacocloud-0.0.5-SNAPSHOT.jar --server.port=9090

Natomiast jeśli chcesz, aby aplikacja zawsze nasłuchiwała na określonym porcie, możeszgo zdefiniować za pomocą zmiennej środowiskowej systemu operacyjnego:

$ export SERVER_PORT=9090

Zwróć uwagę na to, że podczas definiowania właściwości jako zmiennych środowi-skowych konwencja nadawania nazw jest nieco inna i uwzględnia ograniczenia dla nazwzmiennych środowiskowych narzucane przez system operacyjny. To całkowicie zrozu-miałe. Spring potrafi sobie z tym poradzić i bez problemów interpretuje SERVER_PORTjako server.port.

Jak wcześniej wspomniałem, istnieje wiele sposobów definiowania właściwościkonfiguracyjnych. W rozdziale 14. poznasz jeszcze inny sposób na skonfigurowanie wła-ściwości w scentralizowanym serwerze konfiguracyjnym. Do dyspozycji masz setkiwłaściwości konfiguracyjnych, które można wykorzystać podczas dostosowywania dowłasnych potrzeb sposobu zachowania komponentów bean w Springu. Kilka już po-znałeś: server.port w tym rozdziale oraz security.user.name i security.user.passwordw poprzednim.

Nie mam możliwości przedstawienia w tym rozdziale wszystkich dostępnych wła-ściwości konfiguracyjnych. Ograniczę się do wymienienia paru najużyteczniejszych,które będziesz najczęściej spotykać. Na początek przedstawię kilka właściwości po-zwalających na dostosowanie do własnych potrzeb automatycznie skonfigurowanegoźródła danych.

5.1.2. Konfigurowanie źródła danych

W obecnej postaci aplikacja Taco Cloud nadal jest nieukończona. Pozostało jeszczesporo do zrobienia, zanim stanie się gotowa do wdrożenia. Dlatego też osadzona bazadanych H2 używana obecnie jako źródło danych doskonale sprawdza się w tej roli,przynajmniej na razie. Jednak podczas wdrażania aplikacji w środowisku produkcyj-nym prawdopodobnie będziesz chciał rozważyć użycie bardziej trwałego rozwiązaniaopartego na bazie danych.

Wprawdzie istnieje możliwość wyraźnego skonfigurowania własnego komponentubean DataSource, jednak najczęściej jest to niepotrzebne. Zamiast tego prostszym roz-wiązaniem jest skonfigurowanie adresu URL i danych uwierzytelniających do bazydanych, wykorzystując do tego właściwości konfiguracyjne. Na przykład jeśli zaczynaszużywać bazy danych MySQL, być może do pliku application.yml będziesz chciał dodaćnastępujące właściwości:

Poleć książkęKup książkę

Page 15: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

5.1. Dostosowanie konfiguracji automatycznej do własnych potrzeb 141

spring: datasource: url: jdbc:mysql://localhost/tacocloud username: tacodb password: tacopassword

Wprawdzie do pliku specyfikacji kompilacji należy dodać odpowiedni sterownikJDBC, ale zwykle nie trzeba określać klasy tego sterownika — Spring Boot może jąustalić na podstawie struktury adresu URL bazy danych. Jeżeli pojawi się problem,można spróbować ustawić wartość właściwości spring.datasource.driver-class-name,jak pokazałem w kolejnym fragmencie kodu.

spring: datasource: url: jdbc:mysql://localhost/tacocloud username: tacodb password: tacopassword driver-class-name: com.mysql.jdbc.Driver

Spring Boot używa tego połączenia danych podczas konfiguracji automatycznej kom-ponentu bean DataSource. Jeżeli w ścieżce dostępu klas znajduje się pula połączeńTomcat JDBC, to komponent bean z niej skorzysta. W przeciwnym razie Spring Boot(po odszukaniu) użyje którejś z innych dostępnych w ścieżce dostępu klas implementacjipuli połączeń:

HikariCP, Commons DBCP 2.

Choć są to jedyne pule połączeń dostępne za pomocą konfiguracji automatycznej,zawsze możesz wyraźnie skonfigurować komponent bean DataSource i zdecydować sięna użycie dowolnie wybranej implementacji puli połączeń.

Wcześniej w rozdziale wspomniałem o możliwości wskazania skryptów inicjalizacyj-nych bazy danych przeznaczonych do wykonania podczas uruchamiania aplikacji. W ta-kim przypadku użyteczne okazują się właściwości spring.datasource.schema i spring.datasource.data.

spring: datasource: schema: - order-schema.sql - ingredient-schema.sql - taco-schema.sql - user-schema.sql data: - ingredients.sql

Możliwe, że wyraźna konfiguracja źródła danych nie jest w Twoim stylu. Zamiast te-go może preferujesz skonfigurowanie źródła danych w JNDI, skąd zostanie pobraneprzez Springa. W takim przypadku do przygotowania źródła danych możesz skorzy-stać z właściwości spring.datasource.jndi-name.

spring: datasource: jndi-name: java:/comp/env/jdbc/tacoCloudDS

Poleć książkęKup książkę

Page 16: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

142 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

Jeżeli zdefiniujesz właściwość spring.datasource.jndi-name, pozostałe właściwościźródła danych (o ile istnieją) zostaną zignorowane.

5.1.3. Konfigurowanie serwera osadzonego

Wcześniej dowiedziałeś się, jak zdefiniować port serwletu kontenera za pomocą wła-ściwości server.port. Natomiast nie pokazałem tego, co się stanie po przypisaniu tejwłaściwości wartości 0.

server: port: 0

Wprawdzie wyraźnie przypisałeś wartość 0 właściwości server.port, mimo to serwernie będzie nasłuchiwał na porcie o tym numerze. Zamiast tego skorzysta z portuo dowolnie wybranym numerze. Takie rozwiązanie jest użyteczne podczas wykony-wania zautomatyzowanych testów integracji, co ma zagwarantować, że jednocześniewykonywane testy nie będą kolidowały ze sobą w na stałe zdefiniowanym numerzeportu. Jak zobaczysz w rozdziale 13., takie rozwiązanie okazuje się użyteczne takżewtedy, gdy nie przejmujesz się numerem portu z powodu istnienia mikrousługi wy-szukującej go w rejestrze usługi.

Jednak serwer to znacznie więcej niż tylko numer portu, na którym nasłuchuje żą-dań. Jednym z najczęściej wykonywanych zadań związanych z kontenerem jest zde-finiowanie obsługi żądań HTTPS. Wymaga ono przede wszystkim utworzenia maga-zynu kluczy za pomocą działającego z poziomu powłoki narzędzia JDK o nazwiekeytool.

$ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA

To narzędzie wyświetli wiele pytań dotyczących Ciebie i organizacji, do której nale-żysz — większość tych pytań jest bez znaczenia. Musisz natomiast koniecznie zapa-miętać podane hasło. W celu zachowania prostoty przykładu zdecydowałem się naużycie hasła letmein.

Kolejnym krokiem jest zdefiniowanie kilku właściwości włączających HTTPS w osa-dzonym serwerze. Wszystkie można podać w powłoce, choć to szalenie niewygod-ne rozwiązanie. Zamiast tego możesz je umieścić w pliku application.properties lubapplication.yml, np.:

server: port: 8443 ssl: key-store: file:///ścieżka/dostępu/do/pliku/mykeys.jks key-store-password: letmein key-password: letmein

W omawianym przykładzie właściwość server.port ma przypisaną wartość 8443, czyliczęsto stosowany numer portu dla programistycznych serwerów HTTPS. Właściwośćserver.ssl.key-store powinna wskazywać ścieżkę dostępu do pliku będącego maga-zynem kluczy. Tutaj jest to adres URL file:// wskazujący plik do wczytania z systemuplików. Jeżeli będzie się on znajdował w pliku aplikacji JAR, wówczas aby się do niego

Poleć książkęKup książkę

Page 17: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

5.1. Dostosowanie konfiguracji automatycznej do własnych potrzeb 143

odwołać, trzeba będzie użyć adresu URL classpath:. Właściwości server.ssl.key--store-password i server.ssl.key-password mają przypisane hasło, które zostało zdefi-niowane podczas tworzenia magazynu kluczy.

Po zdefiniowaniu tych właściwości aplikacja powinna nasłuchiwać żądań HTTPSna porcie 8443. W zależności od używanej przeglądarki WWW możesz otrzymaćostrzeżenie, że serwer nie potrafi zweryfikować tożsamości. Jednak nie powinieneśsię tym przejmować podczas testowania aplikacji w komputerze lokalnym.

5.1.4. Konfigurowanie rejestrowania danych

Większość aplikacji zapewnia pewną formę rejestrowania danych. Nawet jeśli aplika-cja bezpośrednio nie rejestruje żadnych danych, używane przez nią biblioteki zde-cydowanie będą wykazywały pewną aktywność pod tym względem.

Domyślnie Spring Boot konfiguruje rejestrowanie danych za pomocą Logback(https://logback.qos.ch/), aby generować w konsoli komunikaty na poziomie INFO.Prawdopodobnie widziałeś już wiele komunikatów tego rodzaju w dziennikach zda-rzeń po uruchomieniu aplikacji Taco Cloud i innych przykładów.

Jeżeli chcesz zachować pełną kontrolę nad konfiguracją rejestrowania danych,możesz utworzyć plik logback.xml w katalogu głównym ścieżki dostępu klas (src/main/resources). Spójrz na przykład prostego pliku logback.xml, z którego możesz skorzystać.

<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <logger name="root" level="INFO"/> <root level="INFO"> <appender-ref ref="STDOUT" /> </root></configuration>

Pomijając wzorzec użyty do rejestrowania danych, ta konfiguracja Logback jest mniej wię-cej odpowiednikiem domyślnego zachowania aplikacji, gdy nie istnieje plik logback.xml.Jednak przeprowadzając edycję tego pliku, można zyskać pełną kontrolę nad plikamizdarzeń aplikacji.

UWAGA Specyfika tego, co można umieścić w pliku logback.xml, wykracza poza zakres te-matyczny tej książki. Więcej informacji na ten temat znajdziesz w dokumentacji Logback.

Najczęściej wprowadzane zmiany w konfiguracji rejestrowania danych dotyczą po-ziomu rejestrowania informacji i być może położenia pliku dziennika zdarzeń. Dziękiwłaściwościom konfiguracyjnym Spring Boota te zmiany można wprowadzić bez ko-nieczności tworzenia pliku logback.xml.

Aby zdefiniować poziom rejestrowania danych, należy utworzyć właściwości z pre-fiksem logging.level i nazwą mechanizmu rejestrowania danych, dla którego danawłaściwość jest przeznaczona. Przyjmuję założenie, że chcesz dla rejestrowania da-

Poleć książkęKup książkę

Page 18: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

144 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

nych zdefiniować poziom WARN, a Spring Security rejestruje dane na poziomie DEBUG.Przedstawiona tutaj konfiguracja w pliku application.yml stanowi rozwiązanie w oma-wianej sytuacji.

logging: level: root: WARN org: springframework: security: DEBUG

Opcjonalnie nazwę pakietu Spring Security można zwinąć do pojedynczego wiersza,co powinno ułatwić odczyt.

logging: level: root: WARN org.springframework.security: DEBUG

Teraz przyjmuję założenie, że dane mają zostać zapisywane w pliku TacoCloud.logw katalogu /var/logs/. Można to zdefiniować za pomocą właściwości logging.pathi logging.file, jak pokazałem w kolejnym fragmencie kodu.

logging: path: /var/logs/ file: TacoCloud.log level: root: WARN org: springframework: security: DEBUG

Jeżeli aplikacja ma uprawnienia zapisu w katalogu /var/logs/, informacje mechanizmurejestrowania danych zostaną umieszczone w pliku /var/logs/TacoCloud.log. Domyślnierotacja pliku odbywa się po osiągnięciu przez niego wielkości 10 MB.

5.1.5. Używanie wartości właściwości specjalnych

Podczas przypisywania wartości właściwościom nie jesteś ograniczony jedynie dodeklarowania ich wartości jako na stałe zdefiniowanych w postaci ciągu tekstowego lubliczby. Zamiast tego te wartości mogą pochodzić z innych właściwości konfiguracyjnych.

Przyjmuję założenie, że (z jakiegokolwiek powodu) chcesz właściwości o nazwiegreeting.welcome przypisać wartość innej właściwości, spring.application.name. Jestto możliwe dzięki użyciu miejsca zarezerwowanego ${} podczas definiowania wła-ściwości greeting.welcome.

greeting:

welcome: ${spring.application.name}

Istnieje również możliwość osadzenia tego miejsca zarezerwowanego w innym tekście.

greeting: welcome: Używasz aplikacji ${spring.application.name}.

Poleć książkęKup książkę

Page 19: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

5.2. Tworzenie własnych właściwości konfiguracyjnych 145

Jak widać, konfigurowanie komponentów Springa za pomocą właściwości konfigura-cyjnych niezwykle ułatwia wstrzykiwanie wartości do właściwości tych komponen-tów i tym samym pozwala na dostosowanie do własnych potrzeb konfiguracji auto-matycznej. Właściwości konfiguracyjne nie są przeznaczone tylko dla komponentówbean tworzonych przez Springa. Wkładając niewiele wysiłku, można we własnychkomponentach bean wykorzystać możliwości oferowane przez właściwości konfigu-racyjne. W następnym podrozdziale zobaczysz, jak to zrobić.

5.2. Tworzenie własnych właściwości konfiguracyjnychWcześniej dowiedziałeś się, że właściwości konfiguracyjne to po prostu zwykłe wła-ściwości komponentu bean, które zostały zaprojektowane do akceptowania konfigu-racji pochodzącej z abstrakcji środowiska Springa. Natomiast nie przedstawiłem jesz-cze tego, jak te komponenty bean są projektowane do wykorzystania wspomnianychkonfiguracji.

Aby zapewnić obsługę wstrzykiwania właściwości konfiguracyjnych, Spring Bootdostarcza adnotację @ConfigurationProperties. Po jej zastosowaniu dla dowolnegokomponentu bean właściwości tego komponentu mogą być wstrzykiwane z właściwo-ści środowiska Springa.

Teraz pokażę sposób działania adnotacji @ConfigurationProperties. Przyjmuję za-łożenie, że do kontrolera OrderController dodałeś przedstawioną tutaj metodę odpo-wiedzialną za wyświetlenie wcześniejszych zamówień uwierzytelnionego użytkownika.

@GetMappingpublic String ordersForUser( @AuthenticationPrincipal User user, Model model) {

model.addAttribute("orders", orderRepo.findByUserOrderByPlacedAtDesc(user));

return "orderList";}

Poza tym w OrderRepository dodałeś niezbędną metodę findByUser().

List<Order> findByUserOrderByPlacedAtDesc(User user);

Zwróć uwagę na to, że ta metoda repozytorium zawiera klauzulę OrderByPlacedAtDesc.Człon OrderBy określa właściwość, według której będą uporządkowane wyniki —w omawianym przykładzie jest to placedAt. Słowo Desc na końcu oznacza ułożeniew kolejności malejącej. Dlatego też zwrócona zostanie lista zamówień ułożonych w ko-lejności od najnowszego do najstarszego.

Ta metoda kontrolera może być użyteczna po złożeniu przez użytkownika wielu za-mówień. Okazuje się jednak nieporęczna dla wielu gorliwych koneserów taco. Kilkazamówień wyświetlonych w przeglądarce WWW będzie miało pewną wartość, aleniekończąca się lista setek zamówień to po prostu kłopot. Przyjmuję założenie, żechcesz ograniczyć liczbę wyświetlanych zamówień do 20 najnowszych. W takim przy-padku możesz zmienić metodę ordersForUser() w następujący sposób:

Poleć książkęKup książkę

Page 20: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

146 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

@GetMappingpublic String ordersForUser(@AuthenticationPrincipal User user, Model model) { Pageable pageable = PageRequest.of(0, 20); model.addAttribute("orders", orderRepo.findByUserOrderByPlacedAtDesc(user, pageable));

return "orderList";}

I oczywiście wprowadzić odpowiednią zmianę w OrderRepository:

List<Order> findByUserOrderByPlacedAtDesc(User user, Pageable pageable);

Tutaj po prostu zmieniłem sygnaturę metody findByUserOrderByPlacedAtDesc(), abyakceptowała parametr Pageable. Ten parametr to oferowany przez Spring Data spo-sób na wybór podzbioru wyników przez określenie numeru strony i jej wielkości. W me-todzie kontrolera ordersForUser() następuje utworzenie obiektu PageRequest implemen-tującego Pageable z żądaniem pierwszej strony (o numerze zero) o wielkości 20zawierającej 20 ostatnich zamówień złożonych przez użytkownika.

Wprawdzie takie rozwiązanie działa fantastycznie, ale może pozostawiać pewienniesmak ze względu na zdefiniowaną na stałe w kodzie wielkość strony. Co bowiemzrobić w sytuacji, gdy później uznasz, że 20 to jednak zbyt duża liczba zamówień nastronie, i będziesz chciał zmienić tę wartość na np. 10? Skoro wartość została na stałezdefiniowana w kodzie, trzeba zmodyfikować kod, a następnie ponownie skompilo-wać i wdrożyć aplikację.

Zamiast na stałe definiować w kodzie wielkość strony, lepiej określić ją za pomocąniestandardowej właściwości konfiguracyjnej. Przede wszystkim trzeba dodać do OrderController nową właściwość o nazwie pageSize i oznaczyć OrderController adnotacją@ConfigurationProperties, jak pokazałem na listingu 5.1.

Listing 5.1. Włączenie właściwości konfiguracyjnych w klasie OrderController

@Controller@RequestMapping("/orders")@SessionAttributes("order")@ConfigurationProperties(prefix="taco.orders")public class OrderController { private int pageSize = 20;

public void setPageSize(int pageSize) { this.pageSize = pageSize; }

...

@GetMapping public String ordersForUser(@AuthenticationPrincipal User user, Model model) { Pageable pageable = PageRequest.of(0, pageSize); model.addAttribute("orders", orderRepo.findByUserOrderByPlacedAtDesc(user, pageable));

return "orderList"; }}

Poleć książkęKup książkę

Page 21: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

5.2. Tworzenie własnych właściwości konfiguracyjnych 147

Najważniejsza zmiana wprowadzona na listingu 5.1 polega na dodaniu adnotacji@ConfigurationProperties. Jej atrybut prefix ma wartość taco.orders, co oznacza, żepodczas definiowania właściwości pageSize konieczne jest użycie właściwości konfi-guracyjnej o nazwie taco.orders.pageSize.

Wartością domyślną nowej właściwości pageSize jest 20. Bardzo łatwo można jązmienić przez przypisanie innej wartości taco.orders.pageSize. Oto, jak przypisać war-tość tej właściwości w pliku application.yml:

taco: orders: pageSize: 10

Jeżeli musisz wprowadzić szybką zmianę do aplikacji działającej w środowisku pro-dukcyjnym, możesz to zrobić bez konieczności jej ponownej kompilacji i wdrażania.Wystarczy przypisać wartość właściwości taco.orders.pageSize z użyciem zmiennejśrodowiskowej.

$ export TACO_ORDERS_PAGESIZE=10

Zmianę liczby ostatnio złożonych zamówień można wprowadzić na różne sposoby.W kolejnej sekcji dowiesz się, jak zmieniać dane konfiguracyjne w komponentach prze-chowujących właściwości.

5.2.1. Definiowanie komponentów przechowującychwłaściwości konfiguracyjne

Nic nie wskazuje, że adnotacja @ConfigurationProperties musi być użyta względemkontrolera lub innego rodzaju komponentu bean. Ta adnotacja jest często stosowanadla komponentów bean, których jedynym zadaniem w aplikacji jest przechowywaniedanych konfiguracyjnych. Dzięki temu szczegóły związane z konfiguracją będą prze-chowywane poza kontrolerami i innymi klasami aplikacji. Ponadto takie rozwiązanieznacznie ułatwia współdzielenie właściwości konfiguracyjnych między różnymi kompo-nentami bean, które mogą potrzebować tych informacji.

W przypadku właściwości pageSize w OrderController tę właściwość można wyod-rębnić do oddzielnej klasy. Na listingu 5.2 przedstawiłem przykładowy sposób użyciaklasy OrderProps.

Listing 5.2. Wyodrębnienie właściwości pageSize do klasy przechowującejwłaściwości

package tacos.web;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;import lombok.Data;

@Component@ConfigurationProperties(prefix="taco.orders")@Datapublic class OrderProps { private int pageSize = 20;}

Poleć książkęKup książkę

Page 22: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

148 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

Podobnie jak w OrderController, także tutaj właściwość pageSize ma wartość domyśl-ną 20. Klasa OrderProps została oznaczona adnotacją @ConfigurationProperties, którejatrybut prefix ma wartość taco.orders.

Klasa przechowująca właściwości została oznaczona również adnotacją @Component,aby podczas operacji skanowania komponentu następowało jej automatyczne odkryciei utworzenie egzemplarza klasy jako komponentu bean w kontekście aplikacji Sprin-ga. To bardzo ważne, ponieważ następnym krokiem jest wstrzyknięcie komponentuOrderProps do OrderController.

Nie ma niczego specjalnego w komponentach przechowujących właściwości kon-figuracyjne. Są to po prostu komponenty bean, których właściwości zostały wstrzyknięteze środowiska Springa. Te komponenty mogą być wstrzykiwane do innych kompo-nentów wymagających przechowywanych w nich właściwości. W przypadku OrderController można usunąć z klasy właściwość pageSize i zamiast tego wstrzyknąć kom-ponent bean OrderProps, jak pokazałem w kolejnym fragmencie kodu.

@Controller@RequestMapping("/orders")@SessionAttributes("order")public class OrderController { private OrderRepository orderRepo;

private OrderProps props;

public OrderController(OrderRepository orderRepo, OrderProps props) { this.orderRepo = orderRepo; this.props = props; }

...

@GetMapping public String ordersForUser(@AuthenticationPrincipal User user, Model model) { Pageable pageable = PageRequest.of(0, props.getPageSize()); model.addAttribute("orders", orderRepo.findByUserOrderByPlacedAtDesc(user, pageable));

return "orderList"; } ...}

Teraz klasa OrderController nie jest już odpowiedzialna za obsługę własnych właści-wości konfiguracyjnych. Dzięki temu kod tej klasy jest bardziej elegancki, a właściwościzdefiniowane w OrderProps mogą być używane także w innych wymagających ich kom-ponentach bean. Co więcej, dotyczące zamówień właściwości konfiguracyjne zostajązebrane w jednym miejscu: klasie OrderProps. Jeżeli zachodzi potrzeba dodania, usu-nięcia, zmiany nazwy lub przeprowadzenia innej modyfikacji właściwości, wówczastrzeba to zrobić jedynie w klasie OrderProps.

Przyjmuję założenie, że właściwość pageSize jest używana w wielu innych kompo-nentach bean i zdecydowałeś o zastosowaniu pewnej weryfikacji danych, aby ograni-

Poleć książkęKup książkę

Page 23: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

5.2. Tworzenie własnych właściwości konfiguracyjnych 149

czyć wartość właściwości do przedziału od 5 do 25. W przypadku braku komponentubean przechowującego tę właściwość musiałbyś dodać odpowiednie adnotacje do klasyOrderController, właściwości pageSize i wszystkich pozostałych klas używających tejwłaściwości. Jednak dzięki wyodrębnieniu pageSize do OrderProps zmianę trzeba wpro-wadzić tylko w klasie OrderProps.

package tacos.web;import javax.validation.constraints.Max;import javax.validation.constraints.Min;

import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;import org.springframework.validation.annotation.Validated;

import lombok.Data;

@Component@ConfigurationProperties(prefix="taco.orders")@Data@Validatedpublic class OrderProps { @Min(value=5, message="Wartość musi mieścić się w przedziale od 5 do 25.") @Max(value=25, message="Wartość musi mieścić się w przedziale od 5 do 25.") private int pageSize = 20;}//end::validated[]

Wprawdzie adnotacje @Validated, @Min i @Max można łatwo zastosować w klasie OrderController (i wielu innych komponentach bean możliwych do wstrzyknięcia z OrderProps), ale spowodowałoby to zaśmiecenie kodu kontrolera. Dzięki komponentowibean przechowującemu właściwości konfiguracyjne w jednym miejscu korzystającez nich klasy pozostają względnie czyste.

5.2.2. Deklarowanie metadanych właściwości konfiguracyjnej

W zależności od używanego środowiska IDE możesz zauważyć, że wpis taco.orders.pageSize w pliku application.yml (lub application.properties) powoduje wyświetleniekomunikatu ostrzeżenia informującego o nieznanej właściwości taco. Takie ostrze-żenie pojawia się ze względu na brak metadanych związanych z utworzoną wcześniejwłaściwością konfiguracyjną. Na rysunku 5.2 pokazałem przykład takiego komunikatuwyświetlanego po umieszczeniu kursora myszy nad słowem taco w środowisku IDESpring Tool Suite.

Rysunek 5.2. Komunikat ostrzeżeniainformujący o brakujących metadanychwłaściwości konfiguracyjnej

Poleć książkęKup książkę

Page 24: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

150 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

Metadane właściwości konfiguracyjnej są całkowicie opcjonalne i niewymagane dojej prawidłowego działania. Jednak te metadane okazują się użyteczne podczas do-starczania minimalnej dokumentacji dotyczącej właściwości konfiguracyjnej, zwłasz-cza w środowisku IDE.

Na przykład po umieszczeniu kursora myszy nad właściwością spring.security.user.password zobaczysz minidokumentację, którą pokazałem na rysunku 5.3. Wprawdziewyświetlona dokumentacja jest minimalna, ale może się okazać wystarczająca dozrozumienia przeznaczenia danej właściwości i sposobu jej użycia.

Rysunek 5.3. Dokumentacja wyświetlonapo umieszczeniu kursora myszy nad nazwąwłaściwości w Spring Tool Suite

Aby pomóc tym, którzy mogą używać zdefiniowanych przez Ciebie właściwości kon-figuracyjnych — możesz to być nawet Ty sam w przyszłości — dobrym rozwiązaniemjest utworzenie pewnych metadanych dla tych właściwości. W ten sposób przynajm-niej pozbędziesz się irytujących żółtych ikon ostrzegawczych w środowisku IDE.

Dodawanie metadanych dla niestandardowych właściwości konfiguracyjnych trzebazacząć od utworzenia w katalogu META-INF (np. src/main/resources/META-INF) plikuo nazwie additional-spring-configuration-metadata.json.

SZYBKIE ROZWIĄZANIE PROBLEMU DOTYCZĄCEGOBRAKUJĄCYCH METADANYCH

Jeżeli używasz środowiska IDE Spring Tool Suite, masz opcję pozwalającą na szyb-kie rozwiązanie problemu dotyczącego brakujących metadanych właściwości. Umieśćkursor w wierszu zawierającym ostrzeżenie o brakujących metadanych, a następniewyświetl okno dialogowe Quick Fix (rysunek 5.4) przez naciśnięcie klawiszy Cmd+1(macOS) lub Ctrl+1 (Windows i Linux).

Teraz wybierz opcję Create metadata for… i dodaj pewne metadane dla właści-wości w utworzonym wcześniej pliku additional-spring-configuration-metadata.json.

W przypadku właściwości taco.orders.pageSize metadane mogą mieć postać na-stępującego kodu w formacie JSON:

{ "properties": [ { "name": "taco.orders.page-size", "type": "java.lang.String",

Poleć książkęKup książkę

Page 25: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

5.2. Tworzenie własnych właściwości konfiguracyjnych 151

Rysunek 5.4. Utworzenie metadanych właściwości konfiguracyjnej za pomocą oknadialogowego Quick Fix w Spring Tool Suite

"description": "Określa maksymalną liczbę zamówień wyświetlanych na liście." } ]}

Zwróć uwagę na to, że nazwą właściwości używaną w metadanych jest taco.orders.page-size. Elastyczna konwencja nazw w Spring Boocie pozwala na używanie róż-nych wariantów nazw właściwości, więc np. taco.orders.page-size jest odpowiednikiemdla taco.orders.pageSize.

Po zdefiniowaniu metadanych ikona i komunikat ostrzeżenia powinny zniknąć. Cowięcej, po umieszczeniu kursora myszy nad właściwością taco.orders.pageSize zoba-czysz zdefiniowany wcześniej opis, jak pokazałem na rysunku 5.5.

Rysunek 5.5. Minidokumentacja dla niestandardowej właściwości konfiguracyjnej

Natomiast na rysunku 5.6 pokazałem, że środowisko IDE pomaga, oferując dla niestan-dardowych właściwości konfiguracyjnych możliwość ich automatycznego uzupełniania,podobnie jak w przypadku właściwości konfiguracyjnych dostarczanych przez Springa.

Rysunek 5.6. Metadane właściwości konfiguracyjnej pozwalają na użycie automatycznegouzupełniania kodu

Poleć książkęKup książkę

Page 26: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

152 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

Jak widać, właściwości konfiguracyjne są użyteczne podczas dostosowywania do wła-snych potrzeb zarówno automatycznie skonfigurowanych komponentów, jak i szcze-gółów związanych z obiektami wstrzykiwanymi do komponentów bean aplikacji. Cojednak zrobić w sytuacji, gdy zachodzi potrzeba skonfigurowania innych właściwościdla odmiennych środowisk wdrożenia? W następnym podrozdziale dowiesz się, jak wy-korzystać profile Springa do zdefiniowania konfiguracji przeznaczonej dla konkretnegośrodowiska.

5.3. Konfigurowanie za pomocą profiliGdy aplikacja jest wdrażana w różnych środowiskach, z reguły pewne aspekty konfigu-racji będą w nich inne. Na przykład szczegóły dotyczące nawiązania połączenia z ba-zą danych prawdopodobnie będą różne w środowiskach programistycznym i produk-cyjnym. Jednym ze sposobów pozwalających na unikatową konfigurację właściwości dlaodmiennych środowisk jest wykorzystanie zmiennych środowiskowych dostarczającychwłaściwości konfiguracyjne zamiast ich definiowania w plikach application.propertieslub application.yml.

W trakcie pracy nad aplikacją możesz wykorzystać automatycznie skonfigurowanąbazę danych H2. Jednak w produkcji właściwości konfiguracyjne bazy danych mogąmieć postać zmiennych środowiskowych, jak pokazałem w kolejnym fragmencie kodu.

% export SPRING_DATASOURCE_URL=jdbc:mysql://localhost/tacocloud% export SPRING_DATASOURCE_USERNAME=tacouser% export SPRING_DATASOURCE_PASSWORD=tacopassword

Wprawdzie takie rozwiązanie działa, ale konieczność określania dwóch lub więcejwłaściwości konfiguracyjnych jako zmiennych środowiskowych szybko staje się uciąż-liwa. Ponadto nie istnieje dobry sposób na monitorowanie zmian wprowadzonych w ta-kich zmiennych lub łatwego ich wycofywania, jeśli zostały błędnie zdefiniowane.

Dlatego też wolę pracować z profilami Springa. Profil to nic innego jak konfigura-cja warunkowa, w której różne komponenty bean, klasy i właściwości konfiguracyjnesą stosowane lub ignorowane na podstawie profilu aktywnego podczas uruchamianiaaplikacji.

Przyjmuję założenie, że podczas tworzenia aplikacji i jej debugowania jest uży-wana osadzona baza danych H2 i chcesz dla aplikacji Taco Cloud rejestrować danena poziomie DEBUG. Jednak w środowisku produkcyjnym ma zostać użyta zewnętrznabaza danych MySQL, a dane mają być rejestrowane na poziomie WARN. W środowiskuprogramistycznym można bardzo łatwo zrezygnować z definiowania jakichkolwiekwłaściwości źródła danych i tym samym mieć do dyspozycji automatycznie skonfigu-rowaną bazę H2. Aby rejestrować dane na poziomie DEBUG, właściwości logging.level.tacos w pakiecie tacos trzeba przypisać wartość DEBUG.

logging: level: tacos: DEBUG

Poleć książkęKup książkę

Page 27: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

5.3. Konfigurowanie za pomocą profili 153

To dokładnie takie wymaganie, jakie powinno być spełnione w środowisku programi-stycznym. Jednak po wdrożeniu aplikacji w produkcji i niewprowadzeniu żadnychzmian w pliku application.yml nadal będziesz mógł rejestrować dane na poziomie DEBUGi obsługiwać osadzoną bazę danych H2. Musisz więc zdefiniować profil z właściwo-ściami odpowiednimi dla środowiska produkcyjnego.

5.3.1. Definiowanie właściwości dla konkretnego profilu

Jednym ze sposobów na utworzenie właściwości dla konkretnego profilu jest przygo-towanie kolejnego pliku YAML-a lub właściwości z ustawieniami dla np. środowiskaprodukcyjnego. Nazwa pliku powinna stosować następującą konwencję: application-{nazwa profilu}.yml lub application-{nazwa profilu}.properties. Następnie w nowympliku można zdefiniować ustawienia konfiguracyjne odpowiednie dla tego profilu. Naprzykład możesz utworzyć plik o nazwie application-prod.yml zawierający przedsta-wione tutaj właściwości.

spring: datasource: url: jdbc:mysql://localhost/tacocloud username: tacouser password: tacopasswordlogging: level: tacos: WARN

Inny sposób zdefiniowania właściwości dla konkretnego profilu działa tylko w plikachkonfiguracyjnych typu YAML. Polega na umieszczeniu właściwości charakterystycz-nych dla profilu w oddzielnej sekcji rozpoczynającej się od trzech znaków -. Jeżeli usta-wienia dla środowiska produkcyjnego umieścisz w pliku application.yml, jego zawar-tość może przedstawiać się następująco:

logging: level: tacos: DEBUG

---spring: profiles: prod

datasource: url: jdbc:mysql://localhost/tacocloud username: tacouser password: tacopassword

logging: level: tacos: WARN

Jak widać, znaki --- dzielą profil na dwie sekcje. Druga sekcja zawiera wartość dlaspring.profiles wskazującą, że znajdujące się dalej właściwości są przeznaczone dlaprofilu prod. W sekcji pierwszej nie została użyta wartość dla spring.profiles, dlategoteż znajdujące się w niej właściwości są przeznaczone dla wszystkich profili i używane

Poleć książkęKup książkę

Page 28: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

154 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

domyślnie, jeśli aktywny profil nie ma aktualnie zdefiniowanej danej właściwości konfi-guracyjnej.

Niezależnie od profilu aktywowanego podczas uruchamiania aplikacji, poziomrejestrowania danych dla pakietu tacos to DEBUG, na co wskazuje właściwość zdefiniowa-na w profilu domyślnym. Natomiast jeśli zostanie aktywowany profil prod, wartość wła-ściwości logging.level.tacos będzie nadpisana i wyniesie WARN. Ponadto w przypadkuaktywnego profilu prod właściwości źródła danych wskazują na używanie zewnętrznejbazy danych MySQL.

Istnieje możliwość zdefiniowania właściwości dla dowolnej liczby profili przez utwo-rzenie oddzielnych plików YAML-a application-{nazwa profilu}.yml lub właściwościapplication-{nazwa profilu}.properties. Jeżeli wolisz inne rozwiązanie, wpisz trzy znaki -w pliku application.yml z kolejną właściwością spring.profiles i podaj nazwę profilu,a następnie dodaj wszystkie właściwości niezbędne dla danego profilu.

5.3.2. Aktywowanie profilu

Właściwości przeznaczone dla konkretnego profilu będą użyteczne dopiero wtedy,gdy dany profil stanie się aktywny. Mógłbyś w tym miejscu zapytać: jak się odbywaaktywowanie profilu? Aby profil stał się aktywny, trzeba go dołączyć na liście nazwprofili przekazywanej właściwości spring.profiles.active. W pliku application.ymlmożna to zrobić następująco:

spring: profiles: active: - prod

To jednak prawdopodobnie najgorszy z możliwych sposobów na wybór aktywnegoprofilu. Jeżeli wybierzesz go w pliku application.yml, dany profil stanie się domyślnyi nie skorzystasz z zalety stosowania profili, jaką jest możliwość oddzielenia ustawieńdla poszczególnych środowisk. Dlatego też zachęcam do wyboru aktywnego profiluza pomocą zmiennej środowiskowej. W środowisku produkcyjnym aktywny profilmożesz wybrać za pomocą przedstawionego tutaj polecenia.

% export SPRING_PROFILES_ACTIVE=prod

Jeżeli którakolwiek z wdrożonych aplikacji w danym środowisku będzie miała aktywnyprofil prod, znajdujące się w nim właściwości konfiguracyjne będą miały pierwszeństwoprzed tymi w profilu domyślnym.

W przypadku uruchamiania aplikacji za pomocą pliku wykonywalnego JAR ak-tywny profil można wskazać za pomocą argumentu powłoki, np.:

% java -jar taco-cloud.jar --spring.profiles.active=prod

Zwróć uwagę na to, że nazwa właściwości spring.profiles.active zawiera angielskiesłowo profile w liczbie mnogiej: profiles. Daje to możliwość wskazania więcej niż tyl-ko jednego aktywnego profilu. Bardzo często ma to postać rozdzielonej przecinkamilisty definiowanej ze zmienną środowiskową.

% export SPRING_PROFILES_ACTIVE=prod,audit,ha

Poleć książkęKup książkę

Page 29: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

5.3. Konfigurowanie za pomocą profili 155

W przypadku pliku YAML-a lista jest definiowana, jak pokazałem w kolejnym frag-mencie kodu.

spring: profiles: active: - prod - audit - ha

Warto w tym miejscu wspomnieć jeszcze o jednej kwestii. Gdy aplikacja Springa jestwdrażana w Cloud Foundry, automatycznie będzie aktywowany profil o nazwie cloud.Jeżeli Cloud Foundry to Twoje środowisko produkcyjne, właściwości przeznaczonedo zastosowania w produkcji powinieneś umieścić w profilu cloud.

Jak się okazuje, profile są użyteczne nie tylko podczas warunkowego przypisywa-nia wartości właściwościom konfiguracyjnym w aplikacji Springa. W następnej sekcjidowiesz się, jak zadeklarować komponenty bean przeznaczone dla aktywnego profilu.

5.3.3. Warunkowe tworzenie komponentu bean z profilami

Czasami użyteczne jest dostarczanie unikatowego zbioru komponentów bean dla po-szczególnych profili. Standardowo każdy komponent bean zadeklarowany w klasiekonfiguracyjnej Javy zostaje utworzony niezależnie od tego, który profil jest aktywny.W takim przypadku adnotacja @Profile może wskazać komponent bean jako odpo-wiedni tylko dla konkretnego profilu.

Na przykład w aplikacji Taco Cloud masz komponent bean CommandLineRunnerużywany do wczytania osadzonej bazy danych z danymi składników podczas uru-chamiania aplikacji. Takie rozwiązanie doskonale się sprawdza w środowisku pro-gramistycznym, ale jest niepotrzebne (i niepożądane) po wdrożeniu aplikacji w pro-dukcji. Aby uniemożliwić wczytywanie danych składników po każdym uruchomieniuaplikacji wdrożonej w środowisku produkcyjnym, metodę komponentu bean CommandLineRunner można oznaczyć adnotacją @Profile, jak pokazałem w kolejnym fragmen-cie kodu.

@Bean@Profile("dev")public CommandLineRunner dataLoader(IngredientRepository repo, UserRepository userRepo, PasswordEncoder encoder) { ...}

Przyjmuję założenie, że komponent CommandLineRunner ma zostać utworzony tylkowtedy, gdy aktywny jest profil dev lub qa. W takim przypadku lista profili, dla którychdany komponent powinien być utworzony, jest zdefiniowana następująco:

@Bean@Profile({"dev", "qa"})public CommandLineRunner dataLoader(IngredientRepository repo, UserRepository userRepo, PasswordEncoder encoder) { ...}

Poleć książkęKup książkę

Page 30: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

156 ROZDZIAŁ 5. Praca z właściwościami konfiguracyjnymi

Po wprowadzeniu tej zmiany dane składników będą wczytywane tylko wtedy, gdyaktywny jest profil dev lub qa. Oznacza to konieczność aktywowania profilu dev pod-czas uruchamiania aplikacji w środowisku programistycznym. Znacznie wygodniejszerozwiązanie polega na tym, że komponent bean CommandLineRunner zawsze będzietworzony, pod warunkiem że nie został aktywowany profil prod. W takim przypadkuadnotację @Profile można zastosować nieco inaczej, jak pokazałem w kolejnym frag-mencie kodu.

@Bean@Profile("!prod")public CommandLineRunner dataLoader(IngredientRepository repo, UserRepository userRepo, PasswordEncoder encoder) { ...}

Tutaj znak wykrzyknika oznacza negację nazwy profilu. W efekcie komponent CommandLineRunner zostanie utworzony, jeśli aktywny profil jest inny niż prod.

Istnieje również możliwość użycia adnotacji @Profile dla całej klasy oznaczonej ad-notacją @Configuration. Przyjmuję założenie, że chcesz wyodrębnić komponent beanCommandLineRunner do oddzielnej klasy konfiguracyjnej o nazwie DevelopmentConfig.W takim przypadku można ją oznaczyć adnotacją @Profile.

@Profile({"!prod", "!qa"})@Configurationpublic class DevelopmentConfig { @Bean public CommandLineRunner dataLoader(IngredientRepository repo, UserRepository userRepo, PasswordEncoder encoder) { ... }}

Tutaj komponent bean CommandLineRunner (a także każdy inny komponent bean zde-finiowany w klasie DevelopmentConfig) będzie utworzony tylko wtedy, gdy aktywny profiljest inny niż prod lub qa.

Podsumowanie

Komponent bean w Springu może być oznaczony adnotacją @ConfigurationProperties, aby w ten sposób umożliwić wstrzykiwanie wartości z jednegoz wielu źródeł właściwości.

Właściwości konfiguracyjne mogą być definiowane w argumentach powłoki,zmiennych środowiskowych, we właściwościach systemu JVM, w plikach wła-ściwości, plikach YAML-a itd.

Właściwości konfiguracyjne mogą być używane do nadpisywania ustawieńzdefiniowanych przez konfigurację automatyczną; m.in. mogą określać adresyURL źródeł danych, a także poziomy rejestrowania danych.

Profile w Springu można wykorzystać wraz ze źródłami właściwości do warun-kowego definiowania właściwości konfiguracyjnych na podstawie aktywnegoprofilu.

Poleć książkęKup książkę

Page 31: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Część II

Zintegrowany Spring

ozdziały z drugiej części książki poruszają tematy pomagające w integrowaniuaplikacji Springa z innymi aplikacjami.

Rozdział 6. zawiera rozszerzenie materiału o Spring MVC przedstawione-go w rozdziale 2. i pokazuje, jak utworzyć API REST w Springu. Nauczysz się defi-niować punkty końcowe REST w Spring MVC, włączać zasoby REST z hiperłączami,a także korzystać za pomocą Spring Data REST z automatycznie generowanych i opar-tych na repozytorium punktach końcowych REST. W rozdziale 7. zmienisz nieco per-spektywę i zobaczysz, jak aplikacja Springa może konsumować API REST. W roz-dziale 8. przedstawię komunikację asynchroniczną pozwalającą aplikacji Springa nawysyłanie i otrzymywanie komunikatów za pomocą brokerów JMS (ang. java messageservice), RabbitMQ i Kafka. Natomiast w rozdziale 9. przedstawię deklaratywną inte-grację aplikacji za pomocą projektu Spring Integration. Zapoznasz się z przetwarzaniemdanych w czasie rzeczywistym, definiowaniem przepływu integracji, a także inte-growaniem z systemami zewnętrznymi, np. pocztą elektroniczną i systemem plików.

R

Poleć książkęKup książkę

Page 32: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Poleć książkęKup książkę

Page 33: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Skorowidz

Aabstrakcja środowiska, 139adapter kanału, 252administrowanie, 459adnotacje Spring MVC, 161adres URI, 310agregowanie strumieni, 418aktywator usługi, 249aktywowanie profilu, 154AMQP, 215analiza

pliku specyfikacjikompilacji, 32

struktury projektu, 30zmiennych środowiskowych,

467Apache Kafka

obsługa komunikatów, 225API Initializr, 510

parametry żądania, 511API reaktywne, 293, 316

konfigurowaniezabezpieczeń, 316

API REST, 197, 308aplikacja internetowa, 51asynchroniczne wysyłanie

komunikatów, 201asynchroniczny framework

internetowy, 294ataki typu CSRF, 131automatyczne

odświeżaniewłaściwości, 403przeglądarki, 44

ponowne uruchomienieaplikacji, 44

awarie, 405monitorowanie, 412

Bbezpiecznik, 408

zarządzanie wartościągraniczną, 411

bibliotekaHystrix, 407

agregowanie strumieni,418

panel kontrolny, 413pula wątków, 416

Lombok, 82Traverson, 197

biblioteki szablonów widoku, 75błędy weryfikacji danych, 73brama, 251broker Artemis, 203buforowanie

danych strumieniareaktywnego, 287

szablonów, 44, 77

CCassandra, 325

mapowanie typówdomeny, 329

modelowanie danych, 328tworzenie reaktywnego

repozytorium, 335chmura natywna, 347Cloud Foundry, 487Config Server

definiowanie tokenaVaulta, 393

obsługamagazynu Vault, 391uaktualnień zaczepu, 400

odświeżanie właściwościkonfiguracyjnych, 393

zapisywanie danychwrażliwych, 393

Ddane, 79

statystyczne, 451, 466uwierzytelniające

RabbitMQ, 217wrażliwe

magazyn Vault, 389definiowanie

domeny użytkownika, 119encji użytkownika, 119interfejsu klienta, 366kontrolera reaktywnego, 296przepływu integracji, 235schematu, 87strumienia reaktywnego, 267widoku, 39właściwości komunikatu, 220

deklarowaniebezpiecznika, 408komponentu

nasłuchującego, 214metadanych, 149

diagram koralikowy, 271Docker

aplikacje Spring Boota, 490rozpowszechnianie

aplikacji, 490dodawanie

hiperłączy, 174obsługi brokera, 216własnych hiperłączy, 189

domena, 52jako encja, 99

dostosowanie nazw ścieżek, 184

Poleć książkęKup książkę

Page 34: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

516 Skorowidz

Eencja, 99Eureka, 352

konfigurowanie, 356właściwości klienta, 362

panel kontrolny, 355skalowanie serwera, 359tryb utrzymania

egzemplarza, 358używanie usługi, 363

Ffiltr, 243filtrowanie

danych, 281strumienia reaktywnego, 281

formularz, 62weryfikacja danych, 68, 70

frameworkSpring, 47WebFlux, 293

funkcyjne procedury obsługiżądania, 300

Ggenerowanie danych

strumienia, 275

Hhasła, 114HATEOAS, 172hiperłącza, 174, 189hipermedia, 171

Iimplementacja magazynu

danych, 98informacje

o aktywności aplikacji, 439o aplikacji, 428o komponencie Bean, 431o stanie aplikacji, 449, 466o użytkowniku, 121

inicjalizacja projektu, 26, 497,506, 510na stronie start.spring.io, 506w Spring Tool Suite, 497z poziomu powłoki, 510

integracja, Patrz także SpringIntegrationdefiniowanie przepływu, 235deklarowanie przepływu, 234konfigurowanie

przepływu, 237Spring Integration, 239

tworzenie własnegoprzepływu, 256

IntelliJ IDEA, 500tworzenie projektu, 500

interfejsypowłoki, 512repozytoriów reaktywnych,

343

JJConsole, 477JDBC, 79, 112JMS

konfigurowanie, 202otrzymywanie komunikatów,

211wysyłanie komunikatów, 202

JmsTemplateotrzymywanie komunikatów,

212wysyłanie komunikatów, 204

JMX, java managementextensions, 475

KKafkaTemplate

wysyłanie komunikatów, 227kanał komunikatu, 241klasa

JdbcTacoRepository, 90JdbcTemplate, 80, 83, 84początkowa aplikacji, 35

kompilowanie, 41, 494, 513pliku WAR, 485

komponentasemblera zasobu, 176bean z profilami, 155nasłuchujący, 214

Kafki, 229wyodrębniający

powiadomienie, 402komponenty

Bean, 434MBean, 478

komunikacja synchroniczna, 201komunikaty

Apache Kafka, 225definiowanie właściwości,

220JMS, 202JmsTemplate, 204, 212KafkaTemplate, 227konwertowanie, 208otrzymywanie, 212pobieranie z RabbitMQ, 221przetwarzanie, 210RabbitMQ, 216, 224RabbitTemplate, 217

konfiguracjaautomatyczna, 138, 432udostępnianie, 378–382uruchamianie serwera, 373współdzielona, 372, 380

konfigurowaniedanych uwierzytelniających,

203Eureki, 356JMS, 202konwertera komunikatu,

208, 220osadzonego serwera LDAP,

117przepływu integracji, 237reaktywnej usługi, 318rejestrowania danych, 143rejestru usług, 352serwera osadzonego, 142Spring

Cloud Config Server, 374Integration, 239Security, 110

za pomocą profili, 152źródła danych, 140

Poleć książkęKup książkę

Page 35: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Skorowidz 517

konsola H2, 45kontener Dockera, 490kontroler

DesignTacoController, 86OrderController, 97reaktywny, 296RESTful, 160, 163strony głównej, 40widoku, 72

konwertowanie komunikatu,208, 220

LLDAP, 115, 116lista hiperłączy, 176logowanie, 472

Łłączenie typów reaktywnych, 277

Mmagazyn

danych, 82, 98, 321danych użytkownika, 111

oparty na JDBC, 112oparty na LDAP, 115

Vault, 389dane wrażliwe, 389w Config Server, 391

zapisywanie danychwrażliwych, 390

mapowaniedanych reaktywnych, 284domeny, 339typów domeny, 329żądań HTTP, 436

MBeanwłasne komponenty, 478wysyłanie powiadomień, 480

mechanizm równoważeniaobciążenia, 354

menedżer testów, 37metadane

brakujące, 150właściwości konfiguracyjnej,

149, 151metaframework

tworzenie aplikacji, 513

metodaPOST, 196PUT, 195patchOrder(), 170

metody HTTP, 195, 306mikrousługi, 350, 487minidokumentacja, 151moduł punktu końcowego, 254MongoDB, 325

interfejsy repozytoriówreaktywnych, 343

mapowanie typu domeny, 339tworzenie reaktywnych

repozytoriów, 337monitor bezpiecznika, 416monitorowanie

aktywności HTTP, 439awarii, 412Springa, 475strumienia biblioteki

Hystrix, 415wątków, 440, 469żądań HTTP, 470

Nnarzędzie HashiCorp Vault, 389natywna chmura Springa, 347nazewnictwo osadzonych

związków, 180NetBeans

tworzenie projektu, 503

Oobsługa

awarii, 405błędów, 312brokera RabbitMQ, 216hipermediów, 171komunikatów

Kafki, 226RabbitMQ, 224

magazynudanych, 82Vault, 391

opóźnień, 405Spring Data

Cassandra, 326MongoDB, 338

uaktualnień zaczepu, 400żądań HTTP, 37, 56, 161

odczyt danych, 79odkrywanie usług, 361opcje wdrażania, 484operacja

buffer(), 287take(), 282zebrania

elementów, 289mapy, 289

operacjelogiczne, 290reaktywne, 272

opóźnienia, 405łagodzenie, 410

Ppanel

kontrolny biblioteki Hystrix,413

kontrolny Eureki, 355plik

JAR, 487, 494WAR, 485, 494

pobieraniedanych z serwera, 162zasobów, 309

poleceniecurl, 510spring init, 512

porównywanie haseł, 115potok, 269profile, 152

aktywowanie, 154programowanie

funkcyjne, 319reaktywne, 263, 266

projektanaliza struktury, 30HATEOAS, 174Reactor, 265

przechowywanie danychwrażliwych, 389

przekazywaniedanych do serwera, 167zasobu, 311

przekształcenie, 244

Poleć książkęKup książkę

Page 36: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

518 Skorowidz

przepływFlux, 271integracji, 234, 235reaktywny, 270

przetwarzanieformularza, 62komunikatu, 210

pula wątków, 416punkty końcowe, 187

Actuatora, 427, 476REST, 192

RRabbitMQ, 215, 216, 221RabbitTemplate, 222

pobieranie komunikatów, 222wysyłanie komunikatów, 217

Reactor, 265, 269buforowanie danych, 287dodawanie zależności, 271filtrowanie strumienia, 281generowanie danych

strumienia, 275łączenie typów reaktywnych,

277mapowanie danych, 284operacje logiczne, 290przekształcanie strumienia,

281tworzenie typu reaktywnego,

274reaktywna obsługa danych, 299reaktywne

aplikacje internetowe, 295repozytoria, 325, 335, 337usługi, 318używanie API REST, 293, 308

reaktywnyframework internetowy, 298magazyn danych, 321Spring

Data, 323MVC, 296

reguły weryfikacji danych, 68rejestrowanie

danych, 143, 437, 469usług, 361użytkownika, 123

repozytoriumJDBC, 83JPA, 102GIT, 380konfiguracyjne, 377reaktywne, 323, 325, 335,

337REST, 191RestTemplate, 192, 364

pobieranie zasobu, 194usuwanie zasobu, 196używanie usługi, 364

router, 245

Sserwer

administracyjny, 460, 465konfiguracji, 373LDAP, 116przekazywanie danych, 167uaktualnienie danych, 168usuwanie danych, 170Vault, 389

skalowanie serwera Eureka, 359sortowanie, 186SPA, single-page application, 161specyfikacja kompilacji

Mavena, 32spliter, 247sprawdzanie

poprawności danych, 72Spring, 24Spring Batch, 48Spring Boot, 47Spring Boot Actuator, 423

analiza właściwości, 434dane statystyczne, 442

niestandardowe, 450dostosowywanie, 444informacje

o aktywności aplikacji, 439o aplikacji, 428o komponencie Bean, 431o stanie aplikacji, 429

konfiguracjaaplikacji, 431ścieżki dostępu, 425

mapowania żądań HTTP, 436

monitorowanieaktywności HTTP, 439wątków, 440

punkty końcowe, 424rejestrowanie danych, 437udostępnianie informacji, 447uwierzytelnianie, 473używanie punktów

końcowych, 427własne wskaźniki, 449wstrzykiwanie informacji, 446wyłączanie punktów

końcowych, 426zabezpieczanie, 455

Spring Boot Admin, 459analiza zmiennychśrodowiskowych, 467

dane statystyczne, 466informacje o stanie aplikacji,

466interfejs użytkownika, 463,

464konfigurowanie aplikacji, 462monitorowanie

wątków, 469żądań HTTP, 470

odkrywanie usługi, 463rejestrowanie

danych, 469klientów, 462

serwer administracyjny, 465tworzenie serwera, 460uwierzytelnianie, 473włączanie logowania, 472zabezpieczanie serwera, 471

Spring BootDashboard, 42DevTools, 43

Spring Cloud, 48, 352Config Server, 374Services, 359

Spring Data, 48, 189, 322Cassandra, 326JPA, 98MongoDB, 338repozytorium reaktywne, 323REST, 189

Spring Expression Language, 127

Poleć książkęKup książkę

Page 37: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

Skorowidz 519

Spring Integration, 48, 233,234, 239, 241adapter kanału, 252aktywator usługi, 249brama, 251filtr, 243kanał komunikatu, 241moduł punktu końcowego,

254przekształcenie, 244router, 245spliter, 247

Spring MVC, 78, 296Spring Security, 48, 107, 127

konfigurowanie, 110rozszerzenia, 127włączenie obsługi, 108

Spring Tool Suite, 27, 497inicjalizacja projektu, 497

Spring WebFlux, 295strona logowania, 129stronicowanie, 186struktura projektu, 30strumienie reaktywne

Processor, 268Publisher, 268Subscriber, 268Subscription, 268

strumieńJavy, 268reaktywny, 268

system kontroli wersji, 447szablon widoku, 75szyfrowanie właściwości, 386

Śścieżka dostępu

Actuatora, 425relacji, 184zasobów, 184żądania, 127

środowiskoSpringa, 139uruchomieniowe, 442

Ttestowanie

aplikacji, 36kontrolera, 40

reaktywnego, 303

serwera, 307żądań

GET, 303POST, 306

Thymeleaf, 38Traverson, 197tryb utrzymania egzemplarza, 358tworzenie

aplikacji, 37internetowej, 51

interfejsów repozytoriówreaktywnych, 343

klasy kontrolera, 55komponentu MBean, 478metadanych, 151pliku WAR, 494projektuprzepływu integracji, 256w IntelliJ IDEA, 500w NetBeans, 503za pomocą metaframeworka,

513reaktywnego

API, 293repozytorium, 335, 337

serwera administracyjnego,460

typu reaktywnego, 273na podstawie kolekcji, 274na podstawie obiektu, 273

własnego punktukońcowego, 452

zaczepu, 398typ RxJava, 299

Uuaktualnienie danych

w serwerze, 168udostępnianie

konfiguracji, 378, 379, 382właściwości, 382, 383

uruchamianieprojektu, 41, 513serwera konfiguracji, 373

usługi, 349back-endu, 181informacje o użytkowniku, 121Eureka, 352odkrywanie, 361rejestrowanie, 361REST, 191

usunięciedanych z serwera, 170zasobu, 312

uwierzytelnianie, 114, 380, 473użytkownika, 118

użytkownik, 133używanie

konfiguracji współdzielonej,380

usługiprzez egzemplarz

WebClient, 365za pomocą RestTemplate,

364

Wwartości właściwości

specjalnych, 144wdrażanie, 421, 483

pliku WAR, 485WebClient

używanie usługi, 365weryfikacja danych, 70

formularza, 68widok, 39, 58

biblioteki szablonów, 75własna implementacja

InfoContributor, 445własne

hiperłącza, 189punkty końcowe, 187właściwości

konfiguracyjnych, 145wskaźniki informacji, 449

własnykomponent MBean, 478przepływ integracji, 256punkt końcowy, 452

właściwościdla konkretnego profilu, 153komunikatu, 220konfiguracyjne, 137, 145,

147, 159, 385odświeżanie

automatyczne, 396odświeżanie ręczne, 394odświeżanie w locie, 393

szyfrowanie, 386środowiskowe, 434udostępnianie, 382, 383

Poleć książkęKup książkę

Page 38: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio

520 Skorowidz

właściwościutajnienie, 385w repozytorium, 377

włączanieConfig Server, 374obsługi Spring Data

Cassandra, 326usług back-endu, 181

wstawianiedanych, 89, 94rekordu, 85

wstępne przygotowaniedanych, 87

wstrzykiwanieinformacji, 446repozytorium, 86

wykres przepływureaktywnego, 270

wylogowanie, 131wymiana żądań, 314

wysyłaniekomunikatów

za pomocą JMS, 202za pomocą JmsTemplate,

204powiadomień, 480

wyświetlaniebłędów, 72informacji, 52konfiguracji aplikacji, 431

wzorzec bezpiecznika, 405

Zzabezpieczanie

Actuatora, 455API reaktywnego, 316reaktywnej aplikacji, 316serwera administracyjnego,

471żądań internetowych, 125

zaczep, 398zapisywanie

danych, 79, 90projektów, 93

zarządzanie konfiguracją, 371zmienne środowiskowe, 467

Źźródła danych, 140

Żżądania

długo wykonywane, 311HTTP GET, 56, 163, 303

Poleć książkęKup książkę

Page 40: Tytuł oryginału: Spring in Action, 5th EditionTytuł oryginału: Spring in Action, 5th Edition Tłumaczenie: Robert Górczyński ISBN: 978-83-283-5606-1 Projekt okładki: Studio