Поскольку во многих ответах уже указано, для чего используются эти аннотации, мы сосредоточимся здесь на некоторых незначительных различиях между ними.
Первое сходство
Еще один момент, на который стоит обратить внимание: автоматическое обнаружение сканирования и внедрение зависимостей для 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аннотацией, что означает, что они также являются @Components. Если мы определим нашу собственную пользовательскую аннотацию и аннотируем ее @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основе их облицовочных конвенций. Следовательно, всегда полезно соблюдать соглашение и использовать его в соответствии со слоями.