SOFTWARE DEVELOPMENT

Spring Boot 3 i Java 21 – nowości, zmiany i zastosowania w projektach enterprise

Niniejszy artykuł jest częścią cyklu poświęconego tematyce rozwoju oprogramowania, przygotowanego przez Sebastiana Pieroga



Nowości w Spring Boot 3 i Java 21 to tematy, które elektryzują programistów. Nic w tym dziwnego, ponieważ wiele problemów, takich jak mała liczba wątków czy skomplikowana konfiguracja, odchodzi w zapomnienie wraz z wejściem Spring Boot 3 i Java 21. W tym artykule znajdziesz przegląd najważniejszych zmian w tych technologiach.

Co nowego w Javie 21?

Virtual Threads – rewolucja w zarządzaniu wątkami

W ramach projektu Loom w Javie 21 pojawiły się wirtualne wątki. Klasyczne wątki są ciężkie, a ich tworzenie obciąża system operacyjny, dlatego programista musiał wykorzystywać pule wątków. Wirtualne wątki rozwiązują ten problem – są lekkie, zarządzane przez JVM i mogą być uruchamiane w tysiącach bez zauważalnego kosztu. Co ważne, programista nie zmienia swojego stylu pisania kodu – Virtual Threads wyglądają i działają jak zwykłe wątki, tylko bardziej wydajnie. Oznacza to, że aplikacja może obsłużyć znacznie więcej jednoczesnych żądań bez konieczności stosowania skomplikowanych mechanizmów.

Schemat działania Virtual Threads w Javie 21

Pattern Matching i Record Patterns – prostszy i czytelniejszy kod

Pattern Matching

Pattern Matching to możliwość sprawdzenia typu obiektu oraz jego użycia od razu. To nowa funkcjonalność, która pojawiła się w Javie 21 w bloku switch. Wcześniej należało pisać rozbudowane bloki z instrukcją if, używać instanceof i ręcznie rzutować obiekt. Teraz mechanizm umożliwia zrobienie tego w jednym miejscu, w przejrzysty sposób. W dużych aplikacjach, gdzie często operuje się na typach ogólnych, rozwiązanie to redukuje liczbę błędów oraz poprawia czytelność kodu. Kompilator potrafi sprawdzić, czy wszystkie przypadki zostały obsłużone, co zwiększa bezpieczeństwo. Programista nie musi pamiętać o dodatkowym rzutowaniu ani o ryzyku wystąpienia ClassCastException.

Przykład zastosowania Pattern Matching w Javie 21

Record Patterns

Rekordy w Javie już się dobrze zadomowiły jako prosty sposób definiowania klas przechowujących dane. Record Patterns to krok w kierunku bardziej zwięzłego i wyrazistego kodu. Dzięki nim można bezpośrednio wykorzystać pola rekordu w instrukcjach warunkowych. Oznacza to, że zamiast ręcznie wywoływać metody, można od razu przypisać wartości do zmiennych podczas sprawdzania typu. Dzięki takiemu podejściu kod jest krótszy, mniej podatny na błędy i łatwiejszy do zrozumienia. Jest to przydatne udogodnienie głównie w dużych systemach, gdzie przepływa wiele obiektów DTO. Record Patterns bardzo dobrze współpracują ze wspomnianym wcześniej Pattern Matching, co daje spójny model programowania obiektowego. To wszystko zwiększa czytelność i przyspiesza proces wprowadzania zmian w aplikacji.

Sealed Classes i Scoped Values – większe bezpieczeństwo aplikacji

Sealed Classes

Przykład działania Sealed Classes w Javie 21

Jest to mechanizm pozwalający na dokładniejszą kontrolę hierarchii dziedziczenia. Klasa lub interfejs oznaczony słowem kluczowym sealed może być rozszerzany tylko przez wskazane typy. Dzięki temu mamy pewność, że w systemie nie pojawi się nieoczekiwana implementacja, która mogłaby zaburzyć logikę aplikacji. Jest to szczególnie ważne w dużych systemach, które mają rozbudowaną strukturę klas i interfejsów. Sealed Classes bardzo dobrze współpracują z Record Patterns i Pattern Matching. W rezultacie programista otrzymuje potężne narzędzie do modelowania domeny w sposób bezpieczny i łatwy do utrzymania.

Scoped Values

Jest to alternatywa dla ThreadLocal. Mechanizm umożliwia przekazanie wartości w obrębie wątku w kontrolowany i bezpieczny sposób. W przeciwieństwie do ThreadLocal, Scoped Values mają jasno określony czas życia – działają tylko w ramach wywołania, w którym zostały zdefiniowane. Dzięki temu zmniejszamy ryzyko wycieku pamięci i unikamy trudnych do wykrycia błędów. Scoped Values są szczególnie przydatne w połączeniu z Virtual Threads, bo pozwalają przekazywać dane kontekstowe bez dodatkowego kodu. To bardzo ważne dla aplikacji serwerowych, które obsługują wielu użytkowników jednocześnie i muszą izolować dane. Mechanizm ten jest prosty w użyciu, a jednocześnie zwiększa bezpieczeństwo i przewidywalność aplikacji.

String Templates – wygodna interpolacja tekstu

String Templates, dostępne obecnie w wersji podglądowej, są jedną z najbardziej praktycznych zmian w Javie 21. Do tej pory brakowało wygodnego sposobu interpolacji stringów. Programista używał String.format lub konkatenacji, co często sprawiało, że kod był nieczytelny. String Templates pozwalają wstawiać zmienne do tekstu w prosty i czytelny sposób. Rozwiązanie to poprawia nie tylko czytelność, ale także bezpieczeństwo. W przyszłości ma wspierać m.in. automatyczne sanityzowanie danych wbudowanych do SQL.

Nowości w Spring Boot 3

Wsparcie dla Java 17+ i GraalVM Native Image

Wsparcie tylko dla Java 17+

Spring Boot 3+ wymaga co najmniej Javy w wersji 17. Dzięki temu bez obaw można korzystać z nowoczesnych ulepszeń języka. Jakość i stabilność działania poprawiła się dzięki lepszemu dopasowaniu do najnowszych mechanizmów JVM. Przejście na Javę 17+ umożliwia programistom tworzenie bardziej przejrzystego i efektywnego kodu.

Integracja z GraalVM Native Image

Spring Boot 3 oferuje pełne wsparcie dla kompilacji do natywnych obrazów przy użyciu GraalVM. Takie binarki uruchamiają się bardzo szybko i zużywają znacznie mniej pamięci. Jest to idealne rozwiązanie dla mikroserwisów, funkcji serverless i środowisk cold start. Konfiguracja jest bardzo prosta – wystarczy dodać odpowiednią zależność spring-boot-starter-graalvm oraz uruchomić kompilację przez Maven lub Gradle. Dzięki temu aplikacje mogą działać wydajniej.

Migracja do Jakarta EE 9 i nowe API w Spring Framework 6.1

Przejście do Jakarta 9+

Spring Boot 3 przechodzi całkowicie na specyfikację Jakarta EE 9. Oznacza to zmianę przestrzeni nazw z javax.* na jakarta.*. Eliminacja Java EE to krok w kierunku nowoczesnych standardów Java. Migracja może wymagać aktualizacji importów i bibliotek, ale zapewnia pełną zgodność z aktualnym ekosystemem.

Monitoring aplikacji

Spring Boot 3 wprowadza nowe możliwości monitoringu dzięki zaawansowanemu wsparciu dla Micrometer i metryk Observation API. Dzięki temu można w łatwy sposób śledzić czas wykonywania metod (@Timed), liczyć ich wywołania (@Count) oraz monitorować czas trwania operacji (@Observed). Aplikacje stają się dzięki temu bardziej transparentne – wiadomo, które operacje są wolniejsze i co dzieje się w runtime.

Virtual Threads w Spring Boot – jak włączyć i wykorzystać

W Spring Boot 3.2 pojawiło się wsparcie dla Virtual Threads z Javy 21. Wystarczy ustawić spring.threads.virtual.enabled=true, aby Tomcat, Jetty oraz mechanizmy Springa działały z nowymi lekkimi wątkami. Dzięki temu kod blokujący może działać synchronicznie, z wysoką skalowalnością i niskim kosztem. Kod staje się czytelniejszy, a infrastruktura bardziej responsywna i tańsza w utrzymaniu.

Nowe API dla RestClient i JdbcClient

Spring Framework 6.1 dodał wbudowane wsparcie dla nowych interfejsów RestClient i JdbcClient. To nowoczesna alternatywa dla RestTemplate oraz tradycyjnego podejścia do JDBC. Wprowadzają one bardziej funkcjonalny i deklaratywny styl pisania aplikacji. Spring Boot 3.2 automatycznie je konfiguruje, co umożliwia pisanie czytelnych i testowalnych aplikacji. Nowe API promuje lepszą jakość kodu i wyższą produktywność programistów.

Monitoring aplikacji i Scale to Zero – narzędzia dla chmury

Spring Boot 3.2 wprowadził wstępną obsługę CRaC (Coordinated Restore at Checkpoint). Umożliwia to zapis stanu aplikacji i jej przywrócenie w bardzo krótkim czasie. W połączeniu z GraalVM funkcjonalność ta pozwala osiągnąć niemal zerowy czas startu aplikacji. Jest to szczególnie ważne w środowiskach cloud-native, gdzie częste tworzenie i niszczenie instancji wymaga szybkiej reakcji.

Podsumowanie – dlaczego warto migrować teraz?

Zmiany, które weszły w Javie 21 oraz Spring Boot 3, to nie tylko zmiany technologiczne, ale również nowe możliwości. Oznacza to krótszy czas uruchamiania aplikacji, mniejsze zużycie zasobów, a dla programisty – nowoczesny standard, wydajność i przejrzysty kod. Lepsze narzędzia do monitoringu sprawią, że pojawiające się błędy zostaną szybciej wykryte i skutecznie naprawione. Firmom umożliwi to szybszą reakcję na potrzeby rynku dzięki skalowalności aplikacji oraz łatwiejszej integracji z środowiskami chmurowymi. Nowości te pokazują, że świat Javy wciąż dynamicznie się rozwija. Jeżeli do tej pory odkładaliśmy migrację do wyższej wersji, to teraz jest najlepszy czas, aby to zmienić.


Autor: Sebastian Pieróg, Senior Fullstack Java Developer, ALTEN Polska