Stereotypy

Spring oferuje zestaw specjalnych adnotacji, zwanych stereotypami, które przypisują określone role klasom w kontekście architektury aplikacji. Te adnotacje sterują zachowaniem Springa w odniesieniu do tych klas, definiując ich przeznaczenie i zakres odpowiedzialności. Klasy oznaczone tymi adnotacjami są zazwyczaj specjalizowane do wykonywania określonych zadań w ramach aplikacji, co pozwala na bardziej uporządkowaną i modularną strukturę projektu.

Lista stereotypów

  • Adnotacja @Component
    Podstawowym stereotyp, który stanowi fundament dla innych adnotacji stereotypowych. Adnotacja jest używana do oznaczania klas jako komponentów zarządzanych przez Spring, co umożliwia ich automatyczne wykrywanie i zarządzanie przez kontener Springa.

    Ta adnotacja jest szczególnie przydatna, gdy tworzymy klasy narzędziowe lub pomocnicze, które mają być częścią mechanizmu wstrzykiwania zależności Springa. Dzięki niej, Spring może odpowiednio zarządzać cyklem życia tych komponentów oraz integracją z pozostałą częścią aplikacji.

    Przykład prostego komponentu Springowego, który będzie pełnił rolę konwertera danych:
    @Component
    public class TemperatureConverter {
    
        /**
         * Konwertuje temperaturę z Celsjusza na Fahrenheita.
         *
         * @param celsius Temperatura w stopniach Celsjusza.
         * @return Temperatura w stopniach Fahrenheita.
         */
        public double celsiusToFahrenheit(double celsius) {
            return (celsius * 9/5) + 32;
        }
    }
    
  • Adnotacja @Controller
    Adnotacja informuje Springa, że klasa jest komponentem odpowiedzialnym za obsługę żądań HTTP. Po otrzymaniu żądania HTTP, Spring MVC wybiera metodę w tej klasie, której mapowanie (@RequestMapping lub jej specyficzne warianty jak @GetMapping, @PostMapping itp.) odpowiada ścieżce określonej w żądaniu.

    Szczegółowy mechanizm dopasowywania ścieżek i metodyczny wybór odpowiedniej metody kontrolera są omówione w rozdziale dotyczącym mapowania żądań HTTP w Spring MVC — Spring MVC: Mapowanie requestów HTTP

    Metoda kontrolera może zwracać różne typy danych, w tym nazwę widoku, obiekt ResponseEntity, a także może być typu void co jest szczególnie użyteczne w przypadku odpowiedzi z treścią generowaną dynamicznie. Wynik działania metody kontrolera jest następnie używany do wygenerowania odpowiedzi HTTP, która jest zwracana do klienta.
    @Controller
    public class ItemController {
    
        private final ItemService itemService;
    
        public ItemController(ItemService itemService) {
            this.itemService = itemService;
        }
    
        /**
         * Obsługuje żądanie GET na ścieżce "/dtColumns".
         * Metoda pobiera listę kolumn dla DataTable (DT) z serwisu, a następnie
         * opakowuje je w {@link DTColumnsResponseDTO}.
         *
         * @return ResponseEntity zawierająca obiekt {@link DTColumnsResponseDTO}
         *         z listą kolumn DataTable oraz status HTTP OK.
         * @throws Exception jeśli wystąpi błąd podczas pobierania danych.
         */
        @GetMapping("/dtColumns")
        public ResponseEntity<DTColumnsResponseDTO> getDTColumns() throws Exception {
            List<DTColumn> columns = itemService.getDTColumns();
            DTColumnsResponseDTO dtColumnsResponseDTO
                                                = new DTColumnsResponseDTO(columns);
    
            return new ResponseEntity<>(dtColumnsResponseDTO, HttpStatus.OK);
        }
    }
    
    W tym należy wspomnieć o adnotacji, która co prawda nie należy do pakietu stereotypów Springa, ale jest bardzo często używana w kontekście mapowań rozszerzając możliwości adnotacji @Controller. Mowa tutaj o adnotacji @RestController. Stosując tą adnotację odpowiedzi będą automatycznie konwertowane do formatu JSON, co w wielu przypadkach będzie istotne, np. gdy zewnętrzna usługa oczekuje od nas danych właśnie w tym formacie:
    @RestController
    public class ItemController {
    
        private ItemService itemService; 
    
        ...
    }
    
    Więcej o adnotacji @RestController piszemy podczas opisu adnotacji @ResponseBody, w rozdziale Spring MVC - Metody obsługi żądań HTTP (Handler Methods)
  • Adnotacja @Service
    Adnotacja przeznaczona jest dla klas, których zadaniem jest przetwarzanie logiki biznesowej. Innymi słowy, używamy jej po to by oznaczyć główne miejsce przetwarzania danych za pomocą konkretnych algorytmów:
    @Service
    public class ItemService {
    
        /**
         * Wyszukuje rekordy DataTable ('DT') spełniające kryteria określone
         * w {@code searchRequestDTO}.
         * Sortowanie i paginacja są również obsługiwane zgodnie z parametrami
         * przekazanymi w żądaniu.
         * 'DT' odnosi się do 'DataTable', co w tym kontekście oznacza dynamicznie
         * generowaną tabelę danych z funkcjami takimi jak sortowanie i paginacja.
         *
         * @param searchRequestDTO obiekt DTO zawierający kryteria wyszukiwania
         * oraz informacje o sortowaniu i paginacji.
         * @return lista {@code ItemResponseDTO} zawierająca wyniki wyszukiwania.
         */
        @Override
        public List<ItemResponseDTO> searchDTRecords(SearchRequestDTO searchRequestDTO) {
    
            Sort sort = new Sort(Direction.valueOf(
                                searchRequestDTO.getOrder().get(0).getDir()
                                                                    .toUpperCase())...
            Pageable pageable = new PageRequest(
            searchRequestDTO.getStart() / searchRequestDTO.getLength(),
                                               searchRequestDTO.getLength(), sort);
    
            ...
        }
    }
    
  • Adnotacja @Repository
    Adnotacja oznacza, że dana klasa zarządza bezpośrednio warstwą utrwalania danych, definując przy tym całkiem spory zestaw predefiniowanych metod pomocniczych. Traktuje ona wszystkie obiekty danego typu jako zbiór danych i podchodzi do nich w podobny sposób jak się podchodzi do kolekcji (z jej metodami dodawania, usuwania i modyfikacji), dodając jedynie bardziej zaawansowane możliwości wyszukiwania. Pojęcie Repository zostało wprowadzone już w 2003 roku przez Erica Evansa w książce Domain-Driven Design: Tackling Complexity in the Heart of Software.
    Appa Notka. W przypadku gdy używamy interfejsu JPARepository nie musimy używać tej adnotacji. Wystarczy utworzyć własny interfejs rozszerzający interfejs JPARepository. W ramach takiego interfejsu możemy definiować własne zapytania (custom query), a nawet dokładać metody operujące na natywnych zapytaniach SQL (native query). O tych sposobach piszemy w rozdziałach:

    Spring Data JPA - Zapytania własne (Custom Queries)
    Spring Data JPA: Zapytania Natywne (Native Queries)
    public interface UserRepository extends JpaRepository<User, Long> {
    
        User findByEmailAndPassword(String email, String password);
    
        User findByEmail(String email);
    }
    
  • Adnotacja @Indexed
    Adnotacja została wprowadzona w Springu 5 i jest alternatywą dla skanowania ścieżek klas w celu wyszukiwania komponentów (classpath scanning). Skanowanie odbywa się na etapie kompilacji, co może się przyczynić do przyspieszenia startu dużych aplikacji biznesowych (poprzez rezygnację ze skanowania podczas uruchamiania). Aby skorzystać z tej funkcjonalności należy dodać do projektu zależność, która wygeneruje nam plik z listą komponentów:
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-indexer</artifactId>
            <version>${indexer.version}</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
    
Zdjęcie autora
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
W tej strefie znajdziesz wszystko co niezbędne, aby komfortowo uczyć się Springa. Doskonale opisany kod nie zawiera zbędnych komplikacji, tylko samą esencję w postaci praktycznych przykładów. Tutaj odnajdziesz wszystko co jest istotne w danym temacie. Otrzymujesz pakiet złożony z kilku projektów wraz z obszernym wytłumaczeniem kodu.
Topowe Materiały
Spring IO: Spring Beans and dependency injection
Baeldung: @Component vs @Repository and @Service in Spring

Udemy: [NEW] Spring Boot 3, Spring 6 & Hibernate for Beginners  —  polskie napisy

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE