22 najlepsze praktyki Spring Boot dla programistów
Sprawdź 22 praktyczne wskazówki, jak ułatwić sobie pracę jako programista pracujący ze Spring Boot.
19.10.20226 min

Spring Boot to szeroko stosowany i bardzo popularny framework o wysokiej wydajności na poziomie przedsiębiorstwa. Oto kilka najlepszych praktyk i wskazówek, dzięki którym ulepszysz swoją aplikację Spring Boot i sprawisz, że będzie bardziej wydajna. Ten artykuł będzie nieco dłuższy, a jego przeczytanie może zająć trochę czasu.
Właściwa struktura pakietów
- Odpowiedni dobór pakietów pomoże łatwo zrozumieć kod i przepływ aplikacji.
- Możesz ustrukturyzować swoją aplikację za pomocą pakietów.
- Możesz zawrzeć wszystkie kontrolery w osobnej paczce, usługi w osobnej paczce, klasy util w osobnej paczce ...itd. Ten styl jest bardzo praktyczny w mikroserwisach o małych rozmiarach.
- Jeśli pracujesz nad dużą bazą kodu, można zastosować podejście oparte na funkcjach. Możesz wybrać w zależności od potrzeb.
W oparciu o rodzaj:
W oparciu o funkcję:
Korzystaj z wzorców projektowych
- Nie przyjmuję tutaj żadnych uwag. Wzorce projektowe to już w tym momencie najlepsze praktyki.
- Musisz jednak określić miejsce, w którym będziesz mógł je wykorzystać.
- Sprawdź ten artykuł, aby zrozumieć „how to use the Builder design pattern” w aplikacjach Spring Boot.
Używaj starterów w Spring Boot
- Jest to bardzo ciekawa funkcja w Spring Boot.
- Można bardzo łatwo zastosować zależności starterów bez dodawania pojedynczych zależności jednej po drugiej. Są one już połączone z wymaganymi zależnościami.
- Przykładowo, jeśli dodamy zależność
spring-boot-starter-web
, domyślnie będzie ona połączona z zależnościamijackson
,spring-core
,spring-mvc
ispring-boot-starter-tomcat
. - Nie musimy więc dbać o dodawanie zależności osobno.
- Przyda się również, jeśli chcemy uniknąć niedopasowania wersji.
Używaj właściwych wersji zależności
- Zawsze zalecane jest używanie najnowszych stabilnych wersji GA.
- Czasami może się to różnić od wersji Javy, wersji serwera, rodzaju aplikacji...itp.
- Nie używaj różnych wersji tego samego pakietu i zawsze używaj właściwości <> , aby określić wersję, jeśli istnieje wiele zależności.
Używaj Lomboka
- Jako programista Javy, prawdopodobnie słyszałeś o projekcie Lombok.
- Lombok to biblioteka Javy, która może być używana do redukowania kodu i pozwala pisać czysty kod za pomocą jego adnotacji.
- Przykładowo, możesz użyć wielu linii dla getterów i setterów w niektórych klasach, takich jak encje, obiekty żądania/odpowiedzi, dto...itp.
- Jeśl jednak używasz Lomboka, i jest to tylko jedna linia, możesz użyć
@Data
,@Getter
lub@Setter
, zgodnie z wymaganiami. - Możesz zastosować również adnotację loggera w Lomboku, zaleca się tutaj
@Slf4j
. - Sprawdź ten plik na GitHubie.
Warto wstrzykiwać przez konstruktor w Lomboku
- Kiedy mówimy o wstrzykiwaniu zależności, istnieją dwa rodzaje.
- Jednym z nich jest „
constructor injection
”, a drugim „setter injection
”. Oprócz tego możesz również wykorzystać „field injection
” dzięki bardzo popularnej adnotacji@Autowired
. - Najbardziej jednak zalecamy wstrzykiwanie przez konstruktor. Pozwala to aplikacji zainicjować wszystkie wymagane zależności w czasie inicjalizacji.
- Jest to bardzo przydatne w przypadku testów jednostkowych.
- Ważne jest również to, że możemy użyć adnotacji
@RequiredArgsConstructor
przez Lombok, aby zastosować wstrzykiwanie przez konstruktor. - Sprawdź ten przykładowy kontroler.
Użyj logowania slf4j
- Logowanie jest bardzo ważne.
- Jeśli jakiś problem pojawi się, podczas gdy Twoja aplikacja jest jeszcze w produkcji, logowanie jest jedynym sposobem na poznanie pierwotnej przyczyny.
- Dlatego należy dobrze zastanowić się przed dodaniem loggerów, typów komunikatów logowania, poziomów loggera i komunikatów loggera.
- Nie należy używać System.out.print()
- Slf4j jest zalecany do zastosowania z logback, który jest domyślnym frameworkiem logowania w Spring Boot.
- Zawsze używaj slf4j { } i unikaj używania interpolacji ciągu znaków w komunikatach loggera, ponieważ interpolacja ciągów znaków zużywa więcej pamięci.
- Sprawdź ten plik i zobacz, jak zaimplementować logger.
- Bardzo łatwo stworzysz logger stosując adnotację
@Slf4j
. - Jeśli jesteś ze środowiska mikroserwisów, możesz zastosować stos ELK.
Używaj kontrolerów tylko do routingu
- Kontrolery są dedykowane do routingu.
- Jest to bezstanowe i singletonowe.
- DispatcherServlet sprawdzi
@RequestMapping
na kontrolerach. - Kontrolery są ostatecznym celem żądań, następnie żądania zostaną przekazane do warstwy serwisowej i przetworzone przez warstwę serwisową.
- Logika biznesowa nie powinna znajdować się w kontrolerach.
Wykorzystanie serwisów do logiki biznesowej
- Kompletna logika biznesowa idzie tutaj w parze z walidacjami, cache’owaniem...itp.
- Serwisy komunikują się z warstwą trwałości i otrzymują wyniki.
- Serwisy są również singletonowe.
Unikaj NullPointerException
- Aby uniknąć
NullPointerException
możesz użyćOptional
z pakietu java.util. - Możesz również użyć bibliotek typu
null-safe
, np. Apache Commons StringUtils - Wywołuj metody
equals()
iequalsIgnoreCase()
na znanych obiektach. - Używaj
valueOf()
zamiasttoString()
- Używaj opartych na IDE adnotacji
@NotNull
i@Nullable
.
Wykorzystanie najlepszych praktyk dla frameworka kolekcji
- Używaj odpowiedniej kolekcji dla swojego zbioru danych.
- Używaj
forEach
z funkcjami Java 8 i unikaj używania starszych pętli for. - Używaj
interface type
zamiast implementacji. - Zastosuj
isEmpty()
zamiastsize()
dla lepszej czytelności. - Nie zwracaj wartości null, możesz zwrócić pustą kolekcję.
- Jeśli używasz obiektów jako danych do przechowywania w kolekcji opartej na hashach, powinieneś nadpisać metody
equals()
ihashCode()
.
Używaj paginacji
- Dzięki temu poprawi się wydajność aplikacji.
- Jeśli korzystasz ze Spring Data JPA, funkcja
PagingAndSortingRepository
sprawia, że używanie paginacji jest bardzo proste i nie wymaga dużego wysiłku.
Używaj cache’owania
- Cache’owanie to kolejny ważny czynnik, gdy mówimy o wydajności aplikacji.
- Domyślnie Spring Boot zapewnia cache’owanie z
ConcurrentHashMap
i możesz to osiągnąć poprzez adnotację@EnableCaching
. - Jeśli nie jesteś zadowolony z domyślnego cache’owania, możesz użyć Redis, Hazelcast lub dowolnej innej implementacji rozproszonego cache’owania.
- Redis i Hazelcast to metody cach’owania
in-memory
. Możesz również zastosować implementację pamięci podręcznej bazy danych.
Użycie niestandardowej obsługi wyjątków z globalną obsługą wyjątków
- Jest to bardzo ważne podczas pracy z dużymi aplikacjami na poziomie przedsiębiorstwa.
- Oprócz ogólnych wyjątków możemy mieć także kilka scenariuszy, aby móc zidentyfikować pewne szczególne przypadki błędów.
- Exception adviser może być tworzony z
@ControllerAdvice
i możemy tworzyć oddzielne wyjątki z ważnymi szczegółami. - To znacznie ułatwi identyfikację i debugowanie błędów w przyszłości.
- Sprawdź dokumentację na GitHubie springboot-exceptions-demo oraz założenia projektu.
Użycie niestandardowego obiektu odpowiedzi
- Niestandardowy obiekt odpowiedzi może być użyty do zwrócenia obiektu z pewnymi określonymi danymi z wymaganiami, takimi jak kod stanu HTTP, kod API, wiadomość...itp.
- Możemy użyć builder design pattern, aby utworzyć niestandardowy obiekt odpowiedzi z niestandardowymi atrybutami.
- Przykład zastosowania znajdziesz w artykule "How to use the Builder design pattern with Spring Boot".
Usuwaj zbędne kody, zmienne, metody i klasy.
- Nieużywane deklaracje zmiennych pozyskają trochę pamięci.
- Usuwaj nieużywane metody, klasy...itp, ponieważ wpłynie to na wydajność aplikacji.
- Staraj się unikać zagnieżdżonych pętli. Zamiast tego możesz użyć map.
Stosowanie komentarzy
- Komentowanie jest dobrą praktyką, o ile się jej nie nadużywa.
- NIE komentuj wszystkiego. Zamiast tego możesz stworzyć kod opisowy, używając istotnych słów dla klas, funkcji, metod, zmiennych...itp.
- Usuwaj skomentowane kody, wprowadzające w błąd komentarze i komentarze typu story telling.
- Możesz użyć komentarzy do ostrzeżeń i wyjaśnić coś trudnego do zrozumienia na pierwszy rzut oka.
Używaj sensownych słów dla klas, metod, funkcji, zmiennych i innych atrybutów.
- Wygląda to bardzo prosto, ale wpływ jest ogromny.
- Zawsze używaj odpowiednio sensownych i możliwych do przeszukiwania konwencji nazewnictwa w odpowiednim przypadku.
- Zazwyczaj przy deklarowaniu klas, zmiennych i stałych używamy rzeczowników lub krótkich fraz, np. String firstName, const isValid
- Możesz użyć czasowników i krótkich fraz z przymiotnikami dla funkcji i metod. Np. readFile(), sendData()
- Unikaj używania skrótów nazw zmiennych i intencjonalnych nazw odkrywczych. Np. int i; String getExUsr;
- Jeśli zastosujesz taką formę mądrze, linie komentarzy deklaracji mogą zostać zmniejszone. Ponieważ podajesz sensowne nazwy, początkujący programista może łatwo je zrozumieć, czytając kod.
Używaj właściwego przypadku dla deklaracji
- Istnieje wiele różnych przypadków jak DUŻELITERY, małe litery, camelCase, PascalCase, snake_case, SCREAMING_SNAKE_CASE, kebab-case...itd.
- Musimy jednak określić, który przypadek jest dedykowany do której zmiennej.
- Zazwyczaj stosuję to w ten sposób,
Przykłady:
klasy – PascalCase
metody – camelCase
stałe – SCREAMING_SNAKE_CASE
pola – snake_case
Keep it simple
- Zawsze staraj się pisać proste, czytelne kody.
- Ta sama prosta logika może być zaimplementowana na wiele różnych sposobów, ale trudno ją zrozumieć, jeśli nie jest czytelna lub zrozumiała.
- Czasami złożona logika zużywa więcej pamięci.
- Staraj się używać zasad KISS, DRY i SOLID podczas pisania kodu. Wyjaśnię to w przyszłym artykule.
Używaj wspólnego stylu formatowania kodu
- Każdy programista stosuje inny styl formatowania. Zmiany stylu kodowania są również uważane za zmianę i mogą bardzo utrudnić scalanie kodu.
- Aby tego uniknąć, zespół może ustalić wspólny format kodowania.
Używaj SonarLint
- Jest to bardzo przydatne do znajdowania drobnych błędów i najlepszych praktyk. Dzięki temu unikniesz niepotrzebnych błędów i problemów z jakością kodu.
- Możesz zainstalować wtyczkę w swoim ulubionym IDE.
Dobrego kodowania!
Oryginał tekstu w języku angielskim znajdziesz pod tytułem Spring Boot Best Practices for Developers.