Подтвердить что ты не робот

Где должна храниться аннотация @Service? Интерфейс или реализация?

Я разрабатываю приложение, используя Spring. Я должен использовать аннотацию @Service. Я ServiceI и ServiceImpl такой, что ServiceImpl implements ServiceI. Я смущен здесь, где я должен хранить аннотацию @Service.

Должен ли я аннотировать интерфейс или реализацию с помощью аннотации @Service? Каковы различия между этими двумя подходами?

4b9b3361

Ответ 1

В основном аннотации, такие как @Сервис, @Repository, @Компонент и т.д. все они служат одной и той же цели:

автоматическое обнаружение при использовании конфигурации на основе аннотаций и пути к классам сканирования.

Из моего опыта я всегда использую аннотацию @Service на интерфейсах или абстрактных классах и аннотации, такие как @Component и @Repository для их реализации. @Component аннотация, которую я использую на тех классах, которые служат основным целям, простой Spring beans, не более того. @Repository аннотация, которую я использую в слое DAO, например. если мне нужно связаться с базой данных, иметь некоторые транзакции и т.д.

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

Ответ 2

Я никогда не помещал @Component (или @Service,...) в интерфейс, потому что это делает интерфейс бесполезным. Позвольте мне объяснить, почему.

заявка 1: Если у вас есть интерфейс, вы хотите использовать этот интерфейс для типа точки впрыска.

утверждение 2: Цель интерфейса заключается в том, что он определяет контракт, который может быть реализован несколькими реализациями. С другой стороны у вас есть точка впрыска (@Autowired). Имея только один интерфейс и только один класс, который его реализует, является (IMHO) бесполезным и нарушает YAGNI.

факт: Когда вы ставите:

  • @Component (или @Service,...) в интерфейсе,
  • имеют несколько классов, которые его реализуют,
  • по крайней мере два класса становятся Spring Beans и
  • имеют точку впрыска, которая использует интерфейс для ввода на основе типа,

то вы получите и NoUniqueBeanDefinitionException (или у вас есть очень специальная настройка, с окружением, профили или квалификаторы...)

Вывод: Если вы используете @Component (или @Service,...) в интерфейсе, вы должны нарушить хотя бы один из двух клей. Поэтому я считаю, что не полезно (за исключением некоторых редких сценариев) поставить @Component на уровне интерфейса.


Spring -Data-JPA Интерфейсы репозитория - это нечто совершенно другое

Ответ 3

Я использовал @Component, @Service, @Controller и @Repository аннотации только для классов реализации, а не для интерфейса. Но @Autowired аннотация с интерфейсами по-прежнему работал у меня.

Ответ 4

Плюсы добавления аннотаций в @Service состоят в том, что он дает подсказку, что это сервис. Я не знаю, будет ли какой-либо класс реализации по умолчанию наследовать эту аннотацию.

Сторона

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

Ответ 5

Проще говоря:

@Service представляет собой аннотацию стереотипа для слоя службы.

@Repository представляет собой аннотацию стереотипа для уровня настойчивости.

@Component представляет собой общую стереотипную аннотацию, используемую для указания Spring для создания экземпляра объекта в контексте приложения. Можно  определить любое имя для экземпляра, по умолчанию это имя класса как случай верблюда.

Ответ 6

Существует 5 аннотаций, которые можно использовать для создания spring beans. Список ниже ответов.

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

@Repository - используйте для ввода классов уровня dao.

@Service - используйте для ввода классов уровня обслуживания. На уровне обслуживания вам также может понадобиться аннотация @Transactional для управления транзакциями db.

@Controller - используйте для своих контроллеров уровня интерфейса, таких как управляемый JSF beans, впрыскивающий как spring beans.

@RestController - используйте для контроллеров останова spring, это поможет вам избегать всякого времени, чтобы помещать аннотации @ResponseBody и @RequestBody в ваши методы отдыха.

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