В чем разница между аннотациями @Component, @Repository & @Service в Spring? - PullRequest
1884 голосов
/ 26 июля 2011

Могут ли аннотации @Component, @Repository и @Service использоваться взаимозаменяемо в Spring или они предоставляют какую-либо конкретную функциональность помимо того, что выполняют функцию устройства записи?

Другими словами, если у меня есть Сервиси я поменяю аннотацию с @Service на @Component, будет ли она вести себя так же?

Или аннотация также влияет на поведение и функциональность класса?

Ответы [ 26 ]

1374 голосов
/ 01 августа 2011

С Spring Documentation :

В Spring 2.0 и более поздних версиях аннотация @Repository является маркером для любого класса, который выполняет роль или стереотип (также известный как DataДоступ к объекту или DAO) хранилища.Среди применений этого маркера - автоматический перевод исключений.

Spring 2.5 вводит дополнительные аннотации стереотипа: @Component, @Service и @Controller.@Component - это общий стереотип для любого компонента, управляемого Spring.@Repository, @Service и @Controller являются специализациями @Component для более конкретных случаев использования, например, для уровней сохраняемости, обслуживания и представления соответственно.

Следовательно, вы можете аннотироватьваши классы компонентов с помощью @Component, но, пометив их как @Repository, @Service или @Controller, ваши классы будут более подходящими для обработки инструментами или связывания с аспектами.Например, эти аннотации стереотипов являются идеальными целями для точечных копий.

Таким образом, если вы выбираете между использованием @Component или @Service для уровня обслуживания, @Service, безусловно, является лучшим выбором.Точно так же, как указано выше, @Repository уже поддерживается как маркер для автоматического преобразования исключений в вашем слое постоянства.

┌────────────┬─────────────────────────────────────────────────────┐
│ Annotation │ Meaning                                             │
├────────────┼─────────────────────────────────────────────────────┤
│ @Component │ generic stereotype for any Spring-managed component │
│ @Repository│ stereotype for persistence layer                    │
│ @Service   │ stereotype for service layer                        │
│ @Controller│ stereotype for presentation layer (spring-mvc)      │
└────────────┴─────────────────────────────────────────────────────┘
664 голосов
/ 24 июля 2016

Поскольку во многих ответах уже указано, для чего используются эти аннотации, мы сосредоточимся здесь на некоторых незначительных различиях между ними.

Сначала Сходство

Первое, на что следует обратить внимание, это то, что в отношении автоматического обнаружения сканирования и внедрения зависимостей для BeanDefinition всех этих аннотаций (а именно, @Component, @Service, @Repository, @Controller) одинаковы. Мы можем использовать один на месте другого и все еще может разобраться.


Различия между @Component, @Repository, @Controller и @ Service

@ Компонент

Это универсальная аннотация стереотипа, указывающая на то, что класс является пружинным компонентом.

Что особенного в @ Component
<context:component-scan> только сканирует @Component и не ищет @Controller, @Service и @Repository в целом. Они сканируются, потому что сами помечены @Component.

Просто взгляните на определения аннотаций @Controller, @Service и @Repository:

@Component
public @interface Service {
    ….
}

1045 *

@Component
public @interface Repository {
    ….
}

1048 *

@Component
public @interface Controller {
    …
}

Таким образом, не ошибочно говорить, что @Controller, @Service и @Repository - это особые типы @Component аннотаций. <context:component-scan> подбирает их и регистрирует их следующие классы как бины, как если бы они были помечены @Component.

Аннотации специального типа также сканируются, поскольку сами они снабжены аннотацией @Component, что означает, что они также @Component с. Если мы определим нашу собственную пользовательскую аннотацию и аннотируем ее с помощью @Component, она также будет сканироваться с помощью <context:component-scan>


@ Repository

Это указывает на то, что класс определяет хранилище данных.

Что особенного в @Repository?

В дополнение к указанию, что это Конфигурация на основе аннотаций , задача @Repository состоит в том, чтобы перехватывать специфичные для платформы исключения и повторно выдавать их как одно из унифицированных непроверенных исключений Spring. Для этого нам предоставляется PersistenceExceptionTranslationPostProcessor, который мы должны добавить в контекст приложения Spring, например:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

Этот постпроцессор бина добавляет советник для любого бина, помеченного @Repository, так что любые специфичные для платформы исключения перехватываются, а затем повторно выбрасываются как одно из исключений Spring для непроверенного доступа к данным.


@ контроллер

Аннотация @Controller указывает, что определенный класс выполняет роль контроллера. Аннотация @Controller выступает в качестве стереотипа для аннотированного класса, указывая его роль.

Что особенного в @Controller?

Мы не можем поменять эту аннотацию на любую другую, например @Service или @Repository, даже если они выглядят одинаково. Диспетчер сканирует классы, помеченные @Controller, и обнаруживает методы, помеченные аннотациями @RequestMapping. Мы можем использовать @RequestMapping только в тех методах, классы которых отмечены @Controller, и он будет НЕ работать с @Component, @Service, @Repository и т. Д.

Примечание. Если класс уже зарегистрирован как компонент с помощью какого-либо альтернативного метода, например, с помощью @Bean или @Component, @Service и т. Д. ..., тогда @RequestMapping выбирается, если класс также помечен аннотацией @RequestMapping. Но это другой сценарий.


@ Service

@Service bean-компоненты содержат бизнес-логику и вызывают методы на уровне хранилища.

Что особенного в @Service?

Помимо того факта, что он используется для обозначения того, что он содержит бизнес-логику, в этой аннотации больше ничего не заметно; но кто знает, Spring может добавить еще несколько исключительных в будущем.


Что еще?

Как и выше, вбудущая весна может добавить специальные функции для @Service, @Controller и @Repository на основе их соглашений о наложении слоев. Следовательно, всегда полезно соблюдать соглашение и использовать его в соответствии со слоями.

417 голосов
/ 26 июля 2011

Они почти одинаковы - все они означают, что класс является бобом Spring.@Service, @Repository и @Controller являются специализированными @Component с.Вы можете выполнить определенные действия с ними.Например:

  • @Controller бобы используются Spring-MVC
  • @Repository бобы могут быть переведены исключения персистентности

Другая вещьчто вы семантически назначаете компоненты разным слоям.

Единственное, что предлагает @Component, - это то, что вы можете аннотировать другие аннотации с ним, а затем использовать их так же, как @Service.

Например, недавно я сделал:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

Так что все классы, отмеченные @ScheduledJob, являются пружинными бобами и в дополнение к этому зарегистрированы как кварцевые задания.Вам просто нужно предоставить код, который обрабатывает конкретную аннотацию.

352 голосов
/ 23 мая 2014

@ Компонент эквивалентен

<bean>

@ Service, @Controller, @Repository = {@Component + еще несколько специальных функций}

Это означает, что ServiceКонтроллер и Репозиторий функционально одинаковы.

Три аннотации используются для разделения "Слоев" в вашем приложении,

  • Контроллеры просто выполняют такие вещи, как диспетчеризация, пересылка, вызов методов обслуживания и т. Д.
  • Служба бизнес-логики удержания, расчеты и т. Д.
  • Хранилище - это DAO (объекты доступа к данным), они обращаются к базе данных напрямую.

Теперь вы можете спросить, почему отдельноих: (я предполагаю, что вы знаете AOP-ориентированное программирование)

Допустим, вы хотите контролировать активность только на уровне DAO.Вы напишете класс Aspect (A class), который выполняет некоторую регистрацию до и после вызова каждого метода вашего DAO, вы можете сделать это с помощью AOP, поскольку у вас есть три различных уровня и они не смешаны.

Таким образом, вы можете вести протокол DAO «вокруг», «до» или «после» методов DAO.Вы могли бы сделать это, потому что у вас был DAO в первую очередь.То, что вы только что достигли, это Разделение задач или задач.

Представьте, что если бы была только одна аннотация @Controller, то этот компонент будет иметь смешанную, грязную, распределенную бизнес-логику и доступ к базе данных.code!

Выше был приведен один очень распространенный сценарий, есть еще много случаев использования трех аннотаций.

212 голосов
/ 25 марта 2014

Весной @Component, @Service, @Controller и @Repository являются аннотациями стереотипа, которые используются для:

@Controller:, где ваш запрос отображение со страницы презентации выполнено, т. е. слой Presentation не перейдет в какой-либо другой файл, он перейдет непосредственно к классу @Controller и проверит запрошенный путь в аннотации @RequestMapping, записанной перед вызовом метода, если это необходимо.*@Service: здесь присутствует вся бизнес-логика, то есть вычисления, связанные с данными, и все. Это аннотация бизнес-уровня, в которой наш пользователь не вызывает метод постоянного хранения, поэтому он будет вызывать этот метод с помощью этой аннотации. Он будет запрашивать @Repository в соответствии с запросом пользователя.

@Repository: Это постоянный уровень (Data Access Layer) приложения, который используется для получения данных из базы данных.т. е. все операции, связанные с базой данных, выполняются репозиторием.

@Component - аннотируйте другие компоненты (например, классы ресурсов REST) ​​со стереотипом компонента.

Указывает, что аннотированный класс является « компонент ».Такие классы рассматриваются как кандидаты для автоматического обнаружения при использовании конфигурации на основе аннотаций и сканирования пути к классам.

Другие аннотации на уровне класса также могут рассматриваться как идентифицирующие компонент, как правило, особый вид компонента: например,@ Репозитарий аннотации или аннотации AspectJ @Aspect.

enter image description here

69 голосов
/ 15 мая 2013

Spring 2.5 представляет дополнительные стереотипные аннотации: @Component, @Service и @Controller. @Component служит общим стереотипом для любого компонента, управляемого Spring; в то время как @Repository, @Service и @Controller служат специализациями @Component для более конкретных случаев использования (например, на уровнях сохраняемости, обслуживания и представления соответственно). Это означает, что вы можете аннотировать свои классы компонентов с помощью @Component, но, вместо этого, аннотируя их с помощью @Repository, @Service или @Controller, ваши классы лучше подходят для обработки инструментами или связи с аспектами. Например, эти аннотации стереотипов делают идеальные цели для pointcut. Конечно, также возможно, что @Repository, @Service и @Controller могут нести дополнительную семантику в будущих версиях Spring Framework. Таким образом, если вы принимаете решение между использованием @Component или @Service для своего уровня обслуживания, @Service, безусловно, является лучшим выбором. Аналогично, как указано выше, @Repository уже поддерживается в качестве маркера для автоматического преобразования исключений в вашем слое постоянства.

@Component – Indicates a auto scan component.
@Repository – Indicates DAO component in the persistence layer.
@Service – Indicates a Service component in the business layer.
@Controller – Indicates a controller component in the presentation layer.

ссылка: - Документация Spring - сканирование пути к классам, управляемые компоненты и написание конфигураций с использованием Java

45 голосов
/ 02 ноября 2012

Использование аннотаций @Service и @Repository важно с точки зрения соединения с базой данных.

  1. Использование @Service для всех типов веб-сервисов соединений с БД
  2. Использование @Repository для всех ваших сохраненных подключений к БД proc

Если вы не используете правильные аннотации, вы можете столкнуться с исключениями коммитов, переопределенными транзакциями отката.Во время стресс-нагрузочного теста вы увидите исключения, связанные с откатом транзакций JDBC.

31 голосов
/ 27 июля 2017

Технически @Controller, @Service, @Repository все одинаковы.Все они расширяются @Component.

Из исходного кода Spring:

Указывает, что аннотированный класс является «компонентом».Такие классы рассматриваются как кандидаты для автоматического обнаружения при использовании конфигурации на основе аннотаций и сканирования пути к классам.

Мы можем напрямую использовать @Component для каждого компонента, но для лучшего понимания и удобства сопровождения большого приложения,мы используем @Controller, @Service, @Repository.

Назначение каждой аннотации:

  1. @Controller -> Классы, аннотированные этим, предназначены для получения запросасо стороны клиента.Первый запрос поступает в сервлет-диспетчер, откуда он передает запрос конкретному контроллеру, используя значение @RequestMapping annotation.
  2. @Service -> Классы, аннотированные этим, предназначены для манипулирования данными,что мы получаем от клиента или выбираем из базы данных.Все манипуляции с данными должны выполняться в этом слое.
  3. @Repository -> Классы, аннотированные этим, предназначены для соединения с базой данных.Его также можно рассматривать как уровень DAO (объекта доступа к данным).Этот уровень должен быть ограничен только операциями CRUD (создание, получение, обновление, удаление).Если какие-либо манипуляции требуются, данные должны быть отправлены обратно на уровень @Service.

Если мы поменяемся местами (используйте @Repository вместо @Controller), наше приложение будет работать нормально.

Основная цель использования трех различных @annotations - обеспечить лучшую модульность для приложения Enterprise.

27 голосов
/ 18 июля 2014

@ Repository @ Service и @ Controller служат специализацией @Component для более конкретного использования, при этом вы можете заменить @Service на @Component. но в этом случае вы теряете специализацию.

1. **@Repository**   - Automatic exception translation in your persistence layer.
2. **@Service**      - It indicates that the annotated class is providing a business service to other layers within the application.
26 голосов
/ 25 апреля 2015

все эти аннотации являются типом аннотации типа стерео, разница между этими тремя аннотациями составляет

  • Если мы добавим @Component, то это говорит о роли класса как компонентакласс это означает, что это класс, состоящий из некоторой логики, но он не сообщает, является ли класс, содержащий специфическую бизнес или постоянство или логику контроллера, поэтому мы не используем непосредственно эту аннотацию @Component
  • Если мы добавим @Serviceзатем в аннотации говорится, что роль класса, состоящего из бизнес-логики
  • Если мы добавим @Repository поверх класса, то это говорит о том, что класс, состоящий из логики персистентности
  • Здесь @Component является базовой аннотацией для@ Service, @ Repository и @Controller аннотации

, например

package com.spring.anno;
@Service
public class TestBean
{
    public void m1()
    {
       //business code
    }
}

package com.spring.anno;
@Repository
public class TestBean
{
    public void update()
    {
       //persistence code
    }
}
  • всякий раз, когда мы добавляем @Service или @Repositroy или @Controllerаннотация по умолчанию @Component аннотация собирается существовать поверх класса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...