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

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

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

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

Ответы [ 26 ]

21 голосов
/ 03 января 2016

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

@Component: это базовая аннотация автоматического сканирования компонентов, которая указывает, что аннотированный класс является компонентом автоматического сканирования.

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

@Service: указывает, что аннотированный класс является компонентом службы на бизнес-уровне.

@Repository: эту аннотацию необходимо использовать на уровне постоянства.это действует как хранилище базы данных.

При аннотировании их класса следует выбирать более специализированную форму @Component, поскольку эта аннотация может содержать определенное поведение в будущем.

20 голосов
/ 04 мая 2016

Мы можем ответить на это в соответствии со стандартом Java

Ссылаясь на JSR-330, который теперь поддерживается пружиной, вы можете использовать @Named только для определения bean (как-то @Named=@Component). Таким образом, согласно этому стандарту, кажется, что нет смысла определять стереотипы (такие как @Repository, @Service, @Controller) для категорий bean-компонентов.

Но весной пользователь эти разные аннотации по-разному для конкретного использования, например:

  1. Помогите разработчикам определить лучшую категорию для компетентных. Эта классификация может стать полезной в некоторых случаях. (Например, когда вы используете aspect-oriented, это может быть хорошим кандидатом для pointcuts)
  2. @Repository аннотация добавит некоторую функциональность вашему бину (некоторая автоматическая трансляция исключений для вашего уровня персистентности бина).
  3. Если вы используете пружинный MVC, @RequestMapping можно добавить только к классам, аннотированным @Controller.
18 голосов
/ 22 ноября 2017

Аннотируйте другие компоненты с помощью @Component, например, классы ресурсов REST.

@Component
public class AdressComp{
    .......
    ...//some code here    
}

@ Компонент - это общий стереотип для любого управляемого компонента Spring.

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

@ Компонент в Spring

16 голосов
/ 10 февраля 2014

Даже если мы обмениваемся @Component или @Repository или @ service

Это будет вести себя так же, но один из аспектов заключается в том, что они не смогут поймать какое-то конкретное исключение, связанное с DAO, вместо Repository, если мы используемкомпонент или @ сервис

15 голосов
/ 20 июня 2016

Весной 4, последняя версия:

Аннотация @Repository является маркером для любого класса, который соответствует роль или стереотип репозитория (также известный как объект доступа к данным или DAO). Одним из применений этого маркера является автоматический перевод исключения, как описано в Разделе 20.2.2, «Перевод исключений».

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

12 голосов
/ 26 ноября 2015

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

Для представления компонентов персистентного слоя: @ Репозиторий

Для представления компонентов уровня обслуживания: @ Service

Для представления компонентов уровня представления: @ Controller

или вы можете использовать @Component для всех из них.

12 голосов
/ 21 декабря 2016

@Component - это общая аннотация верхнего уровня, которая делает аннотированный бин сканируемым и доступным в контейнере DI

@Repository является специализированной аннотацией, которая предоставляет возможность преобразования всех непроверенных исключений из классов DAO

@Service - специализированная аннотация. это не приносит никакой новой функции на данный момент, но оно проясняет намерение компонента

@ Controller - это специализированная аннотация, которая информирует MVC компонента и позволяет использовать дальнейшую аннотацию, такую ​​как @RequestMapping и все подобные

Подробнее Детали

10 голосов
/ 28 декабря 2016

A @Service, чтобы процитировать весеннюю документацию,

Указывает, что аннотированный класс является «Сервисом», , первоначально определенным в Domain-Driven Design (Evans, 2003) как «операция предлагается в качестве интерфейса, который является отдельным в модели, без инкапсулированного состояния. " Может также указывать на то, что класс является" Фасадом бизнес-обслуживания "(в смысле шаблонов Core J2EE) или чем-то подобным.Эта аннотация является стереотипом общего назначения, и отдельные группы могут сузить свою семантику и использовать по мере необходимости.

Если вы посмотрите на дизайн, управляемый доменом, Эриком Эвансом,

AСЕРВИС - это операция, предлагаемая в качестве интерфейса, который стоит отдельно в модели, без инкапсуляции состояния, как это делают объекты ENTITIES и VALUE.УСЛУГИ - это общая схема в технических рамках, но они также могут применяться на уровне домена.Служба имен подчеркивает отношения с другими объектами.В отличие от СУЩЕСТВ и ЦЕННЫХ ОБЪЕКТОВ, он определяется исключительно с точки зрения того, что он может сделать для клиента.СЕРВИС имеет тенденцию быть названным для деятельности, а не сущности - глагол, а не существительное.СЕРВИС все еще может иметь абстрактное, преднамеренное определение;это просто имеет другой вкус, чем определение объекта.СЕРВИС все еще должен иметь определенную ответственность, и эта ответственность и интерфейс, выполняющий его, должны быть определены как часть модели предметной области.Названия операций должны исходить из UBIQUITOUS LANGUAGE или вводиться в него.Параметры и результаты должны быть объектами домена.УСЛУГИ должны использоваться разумно и не позволять лишать СУБЪЕКТЫ и ЦЕННЫЕ ОБЪЕКТЫ всего их поведения.Но когда операция на самом деле является важной концепцией предметной области, СЕРВИС является естественной частью ДИЗАЙНА МОДЕЛИ.Объявленная в модели как СЕРВИС, а не как фальшивый объект, который фактически ничего не представляет, автономная операция никого не введет в заблуждение.

и Repository в соответствии с Эриком Эвансом,

Хранилище представляет все объекты определенного типа в виде концептуального набора (обычно эмулируемого).Он действует как коллекция, за исключением более сложных запросов.Объекты соответствующего типа добавляются и удаляются, и механизм, расположенный за хранилищем, вставляет их или удаляет их из базы данных.Это определение объединяет совокупность обязанностей по обеспечению доступа к корням AGGREGATES от раннего жизненного цикла до конца.

9 голосов
/ 03 октября 2018

Репозиторий и Сервис являются потомками Компонент аннотации.Итак, все они Компонент . Репозиторий и Сервис просто разверните его.Как именно? Сервис имеет только идеологическое отличие: мы используем его для сервисов. Репозиторий имеет особый обработчик исключений.

9 голосов
/ 09 ноября 2017

@ Component : вы аннотируете класс @Component, он сообщает hibernate, что это Бин.

@ Repository : вы аннотируете класс @Repository,он сообщает hibernate, что это класс DAO, и рассматривает его как класс DAO.Это означает, что непроверенные исключения (генерируемые из методов DAO) могут быть преобразованы в Spring DataAccessException.

@ Service : это говорит hibernate, что это класс Service, в котором у вас будет служба @Transactional и т. Д.аннотации слоев, поэтому hibernate рассматривает его как компонент Service.

Plus @Service - это преимущество @Component.Предположим, что имя класса bean-компонента - CustomerService, поскольку вы не выбрали способ конфигурации bean-компонента XML, поэтому вы пометили bean-компонент @Component, чтобы указать его как Bean-компонент.Таким образом, при получении объекта bean CustomerService cust = (CustomerService)context.getBean("customerService"); По умолчанию Spring будет нижний регистр первого символа компонента - от CustomerService до customerService.И вы можете получить этот компонент с именем 'customerService'.Но если вы используете аннотацию @Service для класса компонента, вы можете указать конкретное имя компонента по

@Service("AAA")
public class CustomerService{

и получить объект компонента по

CustomerService cust = (CustomerService)context.getBean("AAA");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...