Где должна храниться аннотация @Service? Интерфейс или реализация?
Я разрабатываю приложение с помощью Spring. Я должен использовать @Service Примечание. У меня ServiceI и ServiceImpl такое, что ServiceImpl implements ServiceI. Я запутался здесь, что где я должен держать @Service Примечание.
должен ли я аннотировать интерфейс или реализацию с помощью @Service аннотации? Каковы различия между этими двумя подходами?
7 ответов:
в основном аннотации, как @Service, @ Repository, @Component и т. д. все они служат одной цели:
автоматическое определение при использовании конфигурации на основе аннотаций и пути к классам сканирующий.
из моего опыта я всегда использую
@Serviceаннотации на интерфейсы или абстрактные классы и аннотации, такие как@Componentи@Repositoryдля их реализации.@Componentаннотация я использую на тех классах, которые служат основным целям, простые весенние бобы, не более того.@Repositoryаннотация, которую я использую вDAOслой, например, если мне нужно связаться с базой данных, иметь некоторые транзакции и т. д.поэтому я бы предложил аннотировать ваш интерфейс с помощью
@Serviceи другие слои в зависимости от функциональности.
Я никогда не ставил
@Component(или@Service, ...) на интерфейсе, потому что это делает интерфейс бесполезным. Позвольте мне объяснить почему.п. 1: если у вас есть интерфейс, то вы хотите использовать этот интерфейс для типа точки для инъекций.
п. 2: цель интерфейса заключается в том, что он определяет контракт, который может быть реализован несколькими реализациями. На другой стороне у вас есть точка впрыска (
@Autowired). Имея только один интерфейс и только один класс, который его реализует, является (IMHO) бесполезным и нарушает YAGNI.факт: когда вы ставите:
@Component(или@Service, ...) на интерфейсе,- есть несколько классов, которые его реализуют,
- по крайней мере два класса становятся весенними бобами, и
- есть точка впрыска, которая использует интерфейс для инъекции на основе типа,
тогда вы получите и
NoUniqueBeanDefinitionException(или у вас есть очень специальная настройка конфигураций, с окружением, профилями или Квалификаторами ...)вывод: если вы используете
@Component(или@Service, ...) в интерфейсе, то вы должны нарушить по крайней мере один из двух clains. Поэтому я думаю, что не полезно (за исключением некоторых редких сценариев) ставить@Componentна уровне интерфейса.
Spring-Data-JPA репозиторий интерфейсы-это что-то совершенно другое
Я использовал аннотации @Component, @Service, @Controller и @Repository только в классах реализации, а не в интерфейсе. Но @ Autowired аннотации с интерфейсами по-прежнему работал для меня.
плюсы размещения аннотации на @Service заключается в том, что она дает намек на то, что это сервис. Я не знаю, будет ли какой-либо класс реализации по умолчанию наследовать это раздражение.
сторона Con заключается в том, что вы связываете свой интерфейс с определенной структурой, т. е. Spring, используя аннотацию spring specific. Поскольку интерфейсы должны быть отделены от реализации, я бы не предложил использовать какие-либо конкретные аннотации фреймворка или объектную часть вашего взаимодействие.
одно преимущество весны легко переключить обслуживание (или другую) вставку. Для этого вам нужно аннотировать интерфейс и объявить переменную следующим образом:
@Autowired private MyInterface myVariable;и
@Autowired private MyClassImplementationWhichImplementsMyInterface myVariable;Как и в первом случае, вы можете активировать реализация вводить с момента его уникальным (только один класс реализует интерфейс). Во втором случае необходимо выполнить рефакторинг всего кода (реализация нового класса имеет другое имя). Как следствие, аннотация должна быть на границе как можно больше. Кроме того, прокси JDK хорошо подходят для этого : они создаются и создаются при запуске приложения, потому что тип времени выполнения известен заранее, в отличие от прокси CGlib.
есть 5 аннотаций, которые могут быть использованы для изготовления весенних бобов. Список ниже ответов.
вам действительно нужен интерфейс? Если у вас будет одна реализация для каждого интерфейса службы, просто избегайте ее, используйте только класс. Конечно, если у вас нет RMI или когда требуется прокси-интерфейса.
@Repository-используется для введения классов слоев dao.
@Service-используется для введения классов уровня сервиса. В сервисном слое также возможно, вам придется использовать аннотацию @Transactional для управления транзакциями БД.
@Controller-используйте для своих контроллеров интерфейсного слоя, таких как управляемые бобы JSF, вводимые как весенние бобы.
@RestController-используйте для контроллеров spring rest, это поможет вам избежать каждый раз, когда вы помещаете аннотации @ResponseBody и @RequestBody в свои методы rest.
@Component-используйте его в любом другом случае, когда вам нужно ввести spring bean, который не является контроллер, служба или класс dao
Comments