Поскольку во многих ответах уже указано, для чего используются эти аннотации, мы сосредоточимся здесь на некоторых незначительных различиях между ними.
Первое сходство
Еще один момент, на который стоит обратить внимание: автоматическое обнаружение сканирования и внедрение зависимостей для BeanDefinition все эти аннотации (а именно, @Component, @Service, @Repository, @Controller) одинаковы. Мы можем использовать одно вместо другого и все еще обойтись.
Различия между @Component, @Repository, @Controller и @Service
@Составная часть
Это универсальная аннотация стереотипа, указывающая, что класс является компонентом Spring.
Что особенного в @Component
<context:component-scan>
только сканирует@Component
и не ищет@Controller
,@Service
и@Repository
вообще. Они сканируются, потому что сами помечены@Component
.
Просто взгляните на @Controller
, @Service
и @Repository
определение аннотаций:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Таким образом, это не неправильно, чтобы сказать @Controller
, @Service
и @Repository
это особые типы @Component
аннотаций. <context:component-scan>
подбирает их и регистрирует их следующие классы как бины, как если бы они были помечены @Component
.
Аннотации специального типа также сканируются, потому что они сами помечены @Component
аннотацией, что означает, что они также являются @Component
s. Если мы определим нашу собственную пользовательскую аннотацию и аннотируем ее @Component
, она также будет отсканирована с<context:component-scan>
@Repository
Это указывает на то, что класс определяет хранилище данных.
Что особенного в @Repository?
В дополнение к указанию, что это конфигурация на основе аннотаций , @Repository
задача состоит в том, чтобы перехватывать специфичные для платформы исключения и повторно выдавать их как одно из унифицированных непроверенных исключений Spring. Для этого PersistenceExceptionTranslationPostProcessor
мы получили то, что нам необходимо добавить в контекст приложения Spring, например:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Этот постпроцессор bean добавляет советник для любого bean-компонента, аннотированного @Repository
так, что любые специфичные для платформы исключения перехватываются, а затем повторно генерируются как одно из непроверенных исключений доступа к данным Spring.
@Controller
@Controller
Аннотации указывает на то, что конкретный класс играет роль контроллера. @Controller
Аннотацию выступает в качестве стереотипа для аннотированный класса, что указывает на его роль.
Что особенного в @Controller?
Мы не можем поменять эту аннотацию на любую другую, как @Service
или @Repository
, даже если они выглядят одинаково. Диспетчер просматривает аннотированные классы @Controller
и обнаруживает методы, аннотированные @RequestMapping
аннотациями внутри них. Мы можем использовать @RequestMapping
в / в только те методы, чьи классы аннотированы, @Controller
и они НЕ будут работать @Component
, @Service
и @Repository
т. Д ...
Примечание: Если класс уже зарегистрирован как боб через любой альтернативный способ, как через @Bean
или с помощью @Component
, и @Service
т.д. ... аннотаций, то @RequestMapping
может быть выбран , если класс также с аннотацией @RequestMapping
аннотацию. Но это другой сценарий.
@Обслуживание
@Service
bean-компоненты содержат бизнес-логику и вызывают методы на уровне хранилища.
Что особенного в @Service?
Помимо того, что он используется для обозначения того, что он содержит бизнес-логику, в этой аннотации нет ничего более заметного; но кто знает, весна может добавить некоторые дополнительные исключительные в будущем.
Что еще?
Подобно выше, в будущем Spring может добавлять специальные функциональные возможности для @Service
, @Controller
и на @Repository
основе их облицовочных конвенций. Следовательно, всегда полезно соблюдать соглашение и использовать его в соответствии со слоями.