19.10.20226 min

Ravi YasasFullstack Developer

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.

22 najlepsze praktyki Spring Boot dla programistów

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:

Styl opakowania w oparciu o rodzaj w Spring Boot

 


W oparciu o funkcję:

Styl opakowania w oparciu o funkcję w Spring Boot


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ściami jackson, spring-core, spring-mvc i spring-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.


kod obrazujący używanie właściwych zależności w stabilnej wersji GA


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


Kod w konstruktorze 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 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


Kod obrazujący zastosowanie kontrolera 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() i equalsIgnoreCase() na znanych obiektach.
  • Używaj valueOf() zamiast toString()
  • 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() zamiast size() 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() i hashCode()


Używaj paginacji

przykład zastosowania paginacji w Spring Boot

  • 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

wizualizacja niestandardowego obiektu w Spring Boot

  • 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.


Przykład kodu zbędnego - zmiennego w SpringBoot

  • 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.

Przykład stosowania adekwatnych komend dla klas, metod, funkcji i zmiennych w Spring Boot

  • 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

Przykład zastosowania przypadku dla deklaracji w SPring Boot

  • 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


Przykład wspólnego stylu formatowania kodu w Spring Boot

  • 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.

<p>Loading...</p>