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@Componenti nie szuka@Controller,@Servicei@Repositoryogólnie. Są skanowane, ponieważ sami są opatrzone adnotacjami@Component.
Wystarczy przyjrzeć się @Controller, @Servicea @Repositorydefinicje adnotacji:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Dlatego nie jest to złe @Controller, @Servicea @Repositorysą to specjalne typy @Componentadnotacji. <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 @Componentadnotacjami, 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 , @Repositoryzadaniem 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 @Repositoryczemu 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
@ControllerAdnotacja wskazuje, że dana klasa służy rolę kontrolera. @ControllerAdnotacja 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 @Servicelub @Repository, nawet jeśli wyglądają tak samo. Dyspozytor skanuje klasy opatrzone adnotacjami @Controlleri wykrywa metody opatrzone @RequestMappingadnotacjami. Możemy użyć @RequestMappingna / w tylko tych metod, których klasy są opatrzone @Controlleri to nie działa z @Component, @Service, @Repositoryetc ...
Uwaga: Jeśli klasa jest już zarejestrowana jako fasola za pomocą dowolnej metody alternatywnej, np. Poprzez @Beanlub poprzez @Component, @Serviceitp. Adnotacje, @RequestMappingmożna ją wybrać, jeśli klasa jest również opatrzona @RequestMappingadnotacjami. 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, @Controlleri @Repositoryna podstawie swoich konwencjach kolejności nakładania. Dlatego zawsze dobrze jest przestrzegać konwencji i używać jej zgodnie z warstwami.