Где должна храниться аннотация @Service? Интерфейс или реализация?
Я разрабатываю приложение, используя Spring. Я должен использовать аннотацию @Service
. Я ServiceI
и ServiceImpl
такой, что ServiceImpl implements ServiceI
. Я смущен здесь, где я должен хранить аннотацию @Service
.
Должен ли я аннотировать интерфейс или реализацию с помощью аннотации @Service
? Каковы различия между этими двумя подходами?
Ответы
Ответ 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, который не является контроллером, сервисом или дао классом