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:
Adnotacja | Zastosowanie | Specjalizacja |
---|---|---|
@Component | Ogólna adnotacja dla komponentów | Nie |
@Service | Warstwa logiki biznesowej | Tak |
@Repository | Warstwa dostępu do danych | Tak |
@Controller | Obsługa żądań HTTP | Tak |
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!