Różnica między @Component, @Service, @Repository i @Controller w Springu

You are currently viewing Różnica między @Component, @Service, @Repository i @Controller w Springu

Wstęp

Spring to jeden z najpopularniejszych frameworków w świecie Javy. Jednym z jego kluczowych elementów jest zarządzanie komponentami za pomocą adnotacji, takich jak @Component, @Service, @Repository i @Controller. Chociaż wszystkie pełnią podobną rolę – rejestrowanie klas w kontenerze Springa – to każda z nich ma swoje specyficzne przeznaczenie. Pozostaje pytanie czym się różnią i kiedy, której używać.

@Component – podstawowa adnotacja

@Component to najbardziej ogólna adnotacja służąca do oznaczania klas jako komponentów Springa. Każda klasa oznaczona tą adnotacją jest rejestrowana w kontekście aplikacji jako Spring Bean.

@Component
public class MyComponent {
    public void doSomething() {
        System.out.println("Wykonuję zadanie!");
    }
}

@Component można stosować do dowolnych komponentów aplikacji, jednak w większości przypadków używa się bardziej precyzyjnych adnotacji, takich jak @Service, @Repository czy @Controller. Samej adnotacji użyjemy do bardziej ogólnego użytku, która nie pasuje do żadnego typu z trzech pozostałych np. klasy pomocnicze jak walidacja czy obliczenia matematyczne, konfiguracja z zewnętrznymi bibliotekami.

@Service – warstwa logiki biznesowej

Adnotacja @Service rozszerza funkcjonalność @Component i oznacza, że dana klasa zawiera logikę biznesową aplikacji. Dzięki temu nasz kod staje się czytelniejszy, bo wchodząc do takiego serwisu, wiemy, że mamy do czynienia z jakąś logiką biznesową np. operacje na encjach.

@Service
public class UserService {
    public String getUserInfo() {
        return "Dane użytkownika";
    }
}

@Repository – warstwa dostępu do danych

Adnotacja @Repository jest dedykowana dla klas odpowiedzialnych za dostęp do danych. Ważna cechą tej adnotacji jest to, że Spring widząc ją, automatycznie przechwyci wyjątki związane z bazą danych (zostaną przetłumaczone na wyjątek DataAccessException).

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

@Controller – obsługa żądań HTTP

@Controller to adnotacja dedykowana dla warstwy kontrolerów w Springu. Oznacza klasę, która obsługuje żądania HTTP i zwraca widoki.

@Controller
public class UserController {

    @GetMapping("/user")
    public String getUser(Model model) {
        model.addAttribute("username", "Jan Kowalski");
        return "userView";
    }
}

Jeśli chcesz, aby kontroler zwracał dane JSON/XML, zamiast HTML, użyj @RestController lub dodaj do adnotacji @Controller, adnotację @ResponseBody.

@RestController
public class ApiController {
    
    @GetMapping("/api/user")
    public String getUser() {
        return "Jan Kowalski";
    }
}

Podsumowanie

Każda z wymienionych adnotacji ma swoje konkretne przeznaczenie:

AdnotacjaZastosowanieSpecjalizacja
@ComponentOgólna adnotacja dla komponentówNie
@ServiceWarstwa logiki biznesowejTak
@RepositoryWarstwa dostępu do danychTak
@ControllerObsługa żądań HTTPTak

Jeśli tworzysz komponent ogólnego przeznaczenia, możesz użyć @Component. Dla logiki biznesowej wybierz @Service, dla operacji na bazie danych – @Repository, a dla kontrolerów HTTP – @Controller.

Dobrze dobrane adnotacje sprawiają, że kod jest czytelniejszy, bardziej modułowy i łatwiejszy w zarządzaniu. Jeśli chcesz pisać aplikacje w Springu zgodnie z najlepszymi praktykami, warto trzymać się tego podziału!

Subscribe
Powiadom o
guest
0 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments