
Poprzednim odcinkiem rozpoczęliśmy temat Springa w programowaniu z użyciem Javy. Już wiemy, że esencją tego frameworka jest jego kontekst i adnotacje za pomocą których oddajemy mu kontrolę nad naszymi klasami. Dzisiaj przekonamy się co dostajemy w zamian.
Uwaga! W tej serii zajmuję się opisowym przedstawieniem tematu, a celem jest zapoznanie z zagadnieniem w sposób luźny i zrozumiały dla nowicjusza. W związku z tym wiele elementów siłą rzeczy musi zostać pominiętych. Tych z was, którzy chcieliby się dowiedzieć więcej, zapraszam do źródeł na końcu artykułu.
Uruchamiam stoper.
- Wchodzę na uprzednio przygotowaną zakładkę ze stroną start.spring.io
- Zaznaczam Mavena.
- Klikam przycisk „Add dependencies” i błyskawicznie wybieram opcję „Spring Web„.
- Wciskam kombinację klawiszy CTRL + Enter po czym rozpoczyna się pobieranie archiwum zip.
- PPM -> 7-zip -> „wypakuj tutaj”
- Otwieram nowo utworzony katalog, następnie dwuklik na pom.xml którego rozszerzenie zawczasu przezornie powiązałem z IntelliJ.
- Inwestycja w dysk NvME opłaciła się – środowisko wstało niemalże natyczmiastowo.
- Cholera, trzeba jeszcze dodać projekt to wyjątków w Windows Defenderze. Ten mały manewr będzie mnie sporo kosztował.
- Jest! Projekt załadowany, SHIFT + F10… uruchomiony!
- Wchodzę na http://localhost:8080… STOP!
58 sekund!

Mniej niż minuta. Tyle obecnie wystarczy aby wystawić swoją aplikację na świat. Co prawda, nic ona nie robi poza wywaleniem „404 Not Found”, a do tego działa tylko na maszynie lokalnej, ale to i tak nie w kij dmuchał!
@SpringBootApplication
public class ExampleApp {
public static void main(String[] args) {
SpringApplication.run(ExampleApp.class, args); }}
Dzięki Springowi potrzebujemy zaledwie 4 linijki kodu, aby dokonać czegoś na co w czystej Javie musielibyśmy poświęcić z godzinę* roboty.
(*) Oczywiście przesadzam, bo doświadczonemu programiście nie zajmie to więcej niż parę minut, ale wciąż pamiętam jak pierdzieliłem się z ustawianiem serwera i artefaktów próbując odpalić jeden z moich mniejszych projektów w przeglądarce. Tutaj takich trudności nie uświadczymy.

Masz rację, przepraszam i poprawiam:
Dzięki Spring Bootowi.
Największy problem w rozróżnieniu czystego Springa od Spring Boota polega na odnalezieniu tej cienkiej granicy, gdzie kończy się jeden, a zaczyna drugi.
Dla jasności – można używać samego Springa bez Boot’a, z tym że dojdzie nam wiele dodatkowej pracy z konfiguracją tzw. „bean’ów”, ustawianiem serwera i dociąganiem zależności. Natomiast Spring Boot zdejmuje z nas te obowiązki i jest doskonałym uzupełnieniem Springa.

Spring Boot jest frameworkiem do frameworka Spring.
Przygoda ze Spring Bootem rozpoczyna się najczęściej właśnie na wcześniej przytoczonej stronie start.spring.io tudzież w IntelliJ’u przy tworzeniu nowego projektu z użyciem tzw. Spring Initializera:

Tam właśnie wybieramy komponenty Springa z których zamierzamy korzystać w naszym projekcie. A jest tego sporo – dla każdego coś fajnego, np.
- Spring Web
- Spring Data
- Spring Security
- Spring Integration
- Spring Cloud
Do Spring Clouda nawiązałem już w tekście o mikroserwisach i na chwilę obecną nie ma się co nad nim więcej rozwlekać bo to zaawansowany temat i początkującemu jeszcze długo nie będzie potrzebny.
Jeśli zaś chodzi o pozostałe moduły, to teraz przejdziemy sobie po każdym z nich, pokrótce opisując który za co jest odpowiedzialny.

Spring Web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Owszem, można nie wybierać żadnych zależności i dzięki temu otrzymać pojedynczy plik pom.xml, ale zazwyczaj mamy tam chociaż jeden komponent startowy i z reguły jest to właśnie Spring Web. Już samo wklejenie powyższego kodu do naszego „pom’a” sprawi, że aplikacja wystartuje i rozwali się jak basza na porcie 8080 naszej maszyny.
Od tego momentu tylko jedna klasa dzieli nas od stworzenia REST-owego kontrolera i wyświetlenia „Hello World!” w oknie naszej przeglądarki.
Tutaj się na chwilę zatrzymam,
gdyż chcę żebyś zrozumiał/-a
powagę tego co właśnie zrobiliśmy.
@RestController
public class HelloWorldController {
String htmlCode = "<html><body><h1>Hello, World!</h1></body></html>";
@GetMapping
public String hello(){
return htmlCode;
}
}
W ten prosty sposób, tworząc JEDNĄ klasę z JEDNĄ metodą, dotarliśmy do momentu w którym możemy z naszą aplikacją zrobić praktycznie WSZYSTKO.
Przeglądarka wyrenderuje dowolny kod html jaki tam wrzucimy, od krótkiego kawałka, aż po kompletną stronę WWW.
Pamiętajcie, że długość Stringa w Javie
jest limitowana tylko przez dostępny RAM
– to baaardzo dużo kodu html jaki możemy tam wrzucić!
Oczywiście pełnoprawnych aplikacji nie buduje się w ten sposób, a usługa REST standardowo zwraca obiekty serializowane do formatu JSON albo XML, ale i tak mam nadzieję, że widzisz jaki potencjał właśnie odblokowaliśmy zwyczajnie dodając do pom.xml zaledwie cztery linijki kodu!
W skład Spring Web wchodzi także moduł Spring MVC, który przydaje się w spinaniu frontu z backendem, ale tym zajmiemy się przy innej okazji.

Spring Data
Idziemy dalej i dodajemy zależność Spring Data JPA. Niestety sama jedna nic nie zdziała, gdyż odpowiada za komunikację z bazą danych – dlatego musimy jeszcze dociągnąć choćby jakąś prostą bazkę działającą w pamięci RAM i czyszczącą się z rekordów przy każdym restarcie aplikacji. Taka właśnie jest relacyjna baza H2 – na początek jak znalazł!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
Tutaj wchodzimy w tematy Hibernate’a o którym będzie kolejny odcinek serii, ale już teraz chciałbym wam pokazać jeden przełomowy „ficzer”, który ta kombinacja nam zapodaje.
Stoisz? To lepiej usiądź.
Siedzisz? To lepiej wstań i pa tutaj:

Wygląda jak zwykły interfejs, co nie?
Sęk w tym, że to jest NIEZWYKŁY interfejs. A dokładniej interfejs dostępu do bazy danych. Za pomocą słów kluczowych układamy sobie zapytania, które Spring tłumaczy na język SQL i dynamicznie – w czasie kompilacji – dobudowuje sobie klasę implementującą te metody. Dlatego taka deklaracja:
Optional<Test> findById(Integer id);
oznacza dokładnie to samo co:
SELECT * FROM Test WHERE test.id = id;
Nieźle!? Na początku też byłem zszokowany, jak prowadzący w tutorialu normalnie wybierał sobie dane z interfejsowych (czyli pozbawionych ciała) metod.
A to jedynie wierzchołek góry lodowej o nazwie Spring Data. Temat rozwiniemy już w następnym wpisie.
Spring Security
Dopisujemy kolejne linijki do pom.xml i patrzymy co się stanie:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

Okno logowania. Ot tak, po prostu. Jak gdyby nigdy nic. Bez ustawiania tabelek w HTML-u, bez stylowania CSS-ami, bez dodawania referencji do formularzy, bez implementacji metod REST-owych. Można by powiedzieć:
„ZA DARMO”
Spring Security odpowiada za zabezpieczenie naszej strony przed nieautoryzowanym dostępem. Możemy sami wybierać które endpointy wystawimy każdemu, a które będą dostępne tylko zalogowanym użytkownikom. Możemy ustawiać role takie jak ADMIN, MODERATOR, USER, a każda będzie miała inne przywileje. Możemy wybierać metody haszowania haseł, ich resetowania i przywracania. Możemy… mógłbym tak jeszcze długo, ale chyba już wiecie o co w tym chodzi.

Słówko: „Keylcloak” również od czasu do czasu może się pojawić w ofertach pracy, a odnosi się właśnie do zabezpieczeń i Spring Security. Często (szczególnie w prywatnych projektach i małych firmach) nie chcemy brać na siebie ciężaru utrzymywania bazy danych logowania użytkowników – bo RODO, bo konsekwencje jak coś wycieknie, bo nie mamy od tego specjalisty. Wtedy możemy oddelegować tę niewdzięczną robotę do zewnętrznych narzędzi takich właśnie jak Keycloak. Tam mamy pewność, że opcje bezpieczeństwa są przetestowane i zaimplementowane przez prawdziwych profesjonalistów, że o niczym nie zapomniano.
Keycloak umożliwia łatwe ustawianie wszystkich parametrów z poziomu swojego GUI, a także integrację z zewnętrznymi usługami przez co czasami widzimy takie okienko jak poniżej:

Spring Integration
Integracja w Springu odnosi się przede wszystkim do tzw. message brokerów czyli pośredników umożliwiających komunikację asynchroniczną, np. RabbitMQ czy Kafka. Będzie o tym osobny wpis już wkrótce.
Spring Boot: Podsumowanie
Mam nadzieję, że już widzicie jaki potencjał drzemie w Spring Boocie. Podejrzewam, że dzisiejszy wpis był najdłuższy ze wszystkich dotąd napisanych w tym cyklu, a i tak ledwo liznęliśmy temat.
Piękno omawianego rozwiązania tkwi w jego prostocie w myśl zasady:
Convention over Configuration
(Zwyczaj/norma ponad Konfigurację)
Chodzi o to aby jak najwięcej ustawień miało od razu wartości domyślne – takie jakie są najpopularniejsze w użyciu, by programista od razu mógł zacząć pracę bez uprzedniego błądzenia po dokumentacji próbując ustawić środowisko pod swój projekt. Ci, którym owe parametry nie pasują mają możliwość je szybko zmienić, ale cała reszta ucieszy się mogąc uruchomić swoją pierwszą appkę w mniej niż minutę tak jak to pokazałem na samym początku artykułu.

Pod sam koniec chciałbym wam jeszcze polecić blog Przemka Bykowskiego, znanego w polskich kręgach IT specjalisty od Springa. Znajdziecie tam bardzo dużo informacji o programowaniu: w szczególności z użyciem Javy oraz Spring Boota.
Na dzisiaj tyle, widzimy się już za kilka dni we wpisie poświęconym Hibernate’owi.
Źródła:
Blog Przemka Bykowskiego blog/POL
Przemek Bykowski: SpringBoot – wprowadzenie YT/POL
Kurs Springa dla średnio-zaawansowanych na Udemy (płatne) POL
Książka „Spring w Akcji” Craig Walls