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

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

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

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

Ответы [ 26 ]

5 голосов
/ 21 марта 2018

Объяснение стереотипов:

  • @Service - Аннотируйте все свои классы обслуживания с помощью @Service.Этот слой знает единицу работы.Вся ваша бизнес-логика будет в классах обслуживания.Как правило, методы уровня обслуживания охватываются транзакцией.Вы можете сделать несколько вызовов DAO из метода службы, если одна транзакция не удалась, все транзакции должны откатиться.
  • @Repository - Аннотируйте все ваши классы DAO с помощью @Repository.Вся логика доступа к вашей базе данных должна быть в классах DAO.
  • @Component - аннотировать другие компоненты (например, классы ресурсов REST) ​​со стереотипом компонента.
  • @Autowired - разрешить Spring автоматическиподключите другие компоненты к вашим классам, используя аннотацию @Autowired.

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

Первоначально ответил здесь .

3 голосов
/ 05 июля 2018

В фреймворке Spring есть некоторые особые типы аннотаций, называемые аннотациями стереотипов.Они следующие: -

@RestController- Declare at controller level.
@Controller – Declare at controller level.
@Component – Declare at Bean/entity level.
@Repository – Declare at DAO level.
@Service – Declare at BO level.

выше объявленные аннотации являются особыми, потому что, когда мы добавляем <context:component-scan> в файл xxx-servlet.xml, Spring автоматически создает объект тех классов, которые аннотируются вышеуказанной аннотациейфаза создания / загрузки контекста.

2 голосов
/ 21 июня 2018

@ Компонент, @ Репозиторий, @ Сервис, @Controller:

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

  • @ Хранилище для персистентности
  • @ Сервис услуг и транзакций
  • @ Контроллер для контроллеров MVC

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

Класс, аннотированный @Repository, имеет улучшенный перевод и удобочитаемую обработку ошибок с помощью org.springframework.dao.DataAccessException. Идеально подходит для реализации компонентов, которые обращаются к данным (DataAccessObject или DAO).

Аннотированный класс с @Controller играет роль контроллера в приложении Spring Web MVC

Аннотированный класс с "@Service" играет роль в сервисах бизнес-логики, например шаблон Facade для DAO Manager (Facade) и обработка транзакций

1 голос
/ 30 апреля 2019

Чтобы упростить эту иллюстрацию, давайте рассмотрим техническую специфику в зависимости от случая использования. Эти аннотации используются для инъекции, и, как я сказал буквально « Раньше для инъекции », это означает, что если вы знаете, как использовать Dependency Injection "DI" , и вы должны, тогда вы всегда будете искать эти аннотации, и, пометив классы этими стерео типами , вы сообщаете DI контейнер для сканирования, чтобы быть готовым к инъекции в других местах, это практическая цель.

Теперь давайте перейдем к каждому; first @ Service , если вы строите некоторую логику для конкретного бизнес-кейса, вам нужно отделить ее в месте, где будет содержаться ваша бизнес-логика, этот сервис является обычным классом или вы можете использовать его как интерфейс, если хотите и так написано

@Service
public class Doer {
   // Your logic 
}

// To use it in another class, suppose in Controller 
@Controller
public class XController {
 // You have to inject it like this 
 @Autowired 
 private Doer doer;
}

Все они одинаковы, когда вы вводите их, @ Repository это интерфейс, который применяет реализацию для шаблона репозитория Шаблон проектирования репозитория , обычно он используется, когда вы имеете дело с некоторое хранилище данных или базу данных, и вы обнаружите, что оно содержит несколько готовых реализаций для обработки операций с базой данных; это может быть CrudRepository , JpaRepository и т. д.

// For example
public interface DoerRepository implements JpaRepository<Long, XEntity> {}

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

0 голосов
/ 04 июля 2019

Здесь достаточно хороших ответов, чтобы объяснить аннотации «что такое разница между компонентом репозитория, сервисом».Я хотел бы поделиться разницей между @Controller & @RestController

@Controller против RestController

@RestController:

enter image description here

  • Эта аннотация представляет собой специализированную версию @Controller, которая автоматически добавляет аннотации @Controller и @ResponseBody.поэтому нам не нужно добавлять @ResponseBody к нашим методам отображения.Это означает, что @ResponseBody является активным по умолчанию.
  • Если вы используете @RestController, вы не можете вернуть представление (При использовании Viewresolver в Spring / Spring-Boot)
  • @RestController также преобразуетответ на JSON/XML automatically как @ResponseBody превращает возвращаемые объекты во что-то, что может находиться в теле, e.g. JSON or XML

@Controller

enter image description here

  • @Controller используется для маркировки классов как Spring MVC Controller.Эта аннотация является просто специализированной версией @Component и позволяет автоматически определять классы контроллера на основе сканирования пути к классам.
  • @Controller вы можете вернуть представление в Spring web MVC.

Более детальный просмотр

0 голосов
/ 29 августа 2018
@component
@controller
@Repository
@service
@RestController

Это все аннотации StereoType. Они полезны для создания наших классов в виде пружинных бобов в контейнере ioc,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...