Ponieważ wiele odpowiedzi już wskazuje, do czego służą te adnotacje, skupimy się tutaj na niewielkich różnicach między nimi.
Najpierw podobieństwo
Pierwszym punktem, na który warto zwrócić uwagę, jest to, że w odniesieniu do automatycznego wykrywania i wstrzykiwania zależności dla BeanDefinition wszystkie te adnotacje (tj. @Component, @Service, @Repository, @Controller) są takie same. Możemy użyć jednego zamiast drugiego i nadal możemy sobie poradzić.
Różnice między @Component, @Repository, @Controller i @Service
@Składnik
Jest to stereotypowa adnotacja ogólnego przeznaczenia wskazująca, że klasa jest komponentem sprężynowym.
Co jest specjalnego w @Component,
<context:component-scan>
tylko skanuje@Component
i nie szuka@Controller
,@Service
i@Repository
ogólnie. Są skanowane, ponieważ sami są opatrzone adnotacjami@Component
.
Wystarczy przyjrzeć się @Controller
, @Service
a @Repository
definicje adnotacji:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Dlatego nie jest to złe @Controller
, @Service
a @Repository
są to specjalne typy @Component
adnotacji. <context:component-scan>
podnosi je i rejestruje następujące klasy jako fasolę, tak jakby były opatrzone adnotacjami @Component
.
Adnotacje specjalnego typu są również skanowane, ponieważ same są opatrzone @Component
adnotacjami, co oznacza, że są również adnotacjami @Component
. Jeśli zdefiniujemy własną adnotację i opatrzymy ją adnotacją @Component
, zostanie ona również zeskanowana za pomocą<context:component-scan>
@Magazyn
Oznacza to, że klasa definiuje repozytorium danych.
Co jest specjalnego w @Repository?
Oprócz wskazania, że jest to konfiguracja oparta na adnotacjach , @Repository
zadaniem jest wychwycenie wyjątków specyficznych dla platformy i ponowne ich wyrzucenie jako jednego ze zunifikowanych niesprawdzonych wyjątków Springa. W tym celu zapewniamy PersistenceExceptionTranslationPostProcessor
, że musimy dodać w kontekście naszej aplikacji Spring w następujący sposób:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Ten postprocesor komponentu bean dodaje doradcę do każdego komponentu bean, który jest opatrzony adnotacjami, dzięki @Repository
czemu wychwytywane są wyjątki specyficzne dla platformy, a następnie ponownie zgłaszane jako jeden z niesprawdzonych wyjątków dostępu do danych Springa.
@Kontroler
@Controller
Adnotacja wskazuje, że dana klasa służy rolę kontrolera. @Controller
Adnotacja działa jako stereotypu dla klasy adnotacjami, wskazując swoją rolę.
Co jest specjalnego w @Controller?
Nie możemy zamienić tej adnotacji na inne, podobne @Service
lub @Repository
, nawet jeśli wyglądają tak samo. Dyspozytor skanuje klasy opatrzone adnotacjami @Controller
i wykrywa metody opatrzone @RequestMapping
adnotacjami. Możemy użyć @RequestMapping
na / w tylko tych metod, których klasy są opatrzone @Controller
i to nie działa z @Component
, @Service
, @Repository
etc ...
Uwaga: Jeśli klasa jest już zarejestrowana jako fasola za pomocą dowolnej metody alternatywnej, np. Poprzez @Bean
lub poprzez @Component
, @Service
itp. Adnotacje, @RequestMapping
można ją wybrać, jeśli klasa jest również opatrzona @RequestMapping
adnotacjami. Ale to inny scenariusz.
@Usługa
@Service
komponenty bean przechowują logikę biznesową i metody wywoływania w warstwie repozytorium.
Co jest specjalnego w @Service?
Poza faktem, że jest używany do wskazania, że trzyma logikę biznesową, w tej adnotacji nie ma nic więcej zauważalnego; ale kto wie, wiosna może dodać w przyszłości dodatkowe wyjątki.
Co jeszcze?
Podobny do powyższego, w przyszłości Wiosna może dodać specjalne funkcje dla @Service
, @Controller
i @Repository
na podstawie swoich konwencjach kolejności nakładania. Dlatego zawsze dobrze jest przestrzegać konwencji i używać jej zgodnie z warstwami.