#java #spring
#java #весна
Вопрос:
В моем приложении у меня есть несколько компонентов, которые используют сервисы. Службы аннотируются @Named("Name")
и вводятся с @Inject
помощью .
У меня есть служба. У меня есть интерфейс и реализация для него. В другом модуле моего приложения я могу использовать эту службу разными способами, но некоторые методы должны отличаться, и мне нужны новые. Итак, я хотел расширить первую службу другой.
Я придумал что-то вроде этого:
Interface Service1 {...}
@Named(Service1)
Class Service1Impl implements Service1 {...}
Interface SpecialService1 extends Service1 {...}
@Named(SpecialService1)
Class SpecialService1 extends Service1Impl implements SpecialService1 {...}
Конечно, когда я запускаю свой сервер, я получаю сообщение о том, что нет подходящего компонента с типом Service1
, потому что есть два совпадения классов, реализующих Service1 .
Но мне нужно расширить Service1
, SpecialService1
чтобы получить доступ ко всем методам, и мне нужно расширить Service1Impl
, SpecialService1Impl
чтобы мне не приходилось все реализовывать снова.
В моем компоненте я просто хочу внедрить SpecialService1
и получить доступ ко всем методам Service1
and SpecialService1
.
Есть ли у вас какие-либо идеи, как я мог бы заставить такую конструкцию работать?
Комментарии:
1. Если ваш компонент является и
Service1
тем, и другим, иSpecialService1
вам нужно только зарегистрироватьSpecialService1
, а не другой.2. Не совсем понимаю, что вы имеете в виду. В других компонентах мне нужно только ввести Service1. В другом компоненте мне нужен SpecialService1. Я вводю только один из них для каждого компонента. Но я должен поставить @Named над обеими службами, чтобы иметь возможность вводить одну из них.
3. Нет, вы этого не делаете… Ваш
SpecialService1
тожеService1
… Таким образом, вам нужен только экземплярSpecialService1
для выполнения роли обоих… Если вам действительно нужны 2 экземпляра, вам нужно будет различать их, используя a@Qualifier
… Возможно, вы захотите пометить свой@Service1
как@Primary
, чтобы он использовался по умолчанию, а другой вводился выборочно.4. Да, мне нужно иметь возможность использовать их по-разному. В некоторых областях моего приложения мне нужен Service1, потому что я хочу использовать оригинальные методы, а в одной области мне нужны перезаписанные версии, поэтому мне нужен SpecialService1. Но аннотация @Primary работает нормально. Таким образом, мне нужно только пометить specialService. Спасибо.
Ответ №1:
Коллега дал мне совет, и я заставил его работать.
Везде, где я хочу внедрить одну из служб, которые я должен добавить @Qualifier("Service1")
. Таким образом, он знает, какую службу вводить.
У вас есть более элегантное решение для этого? Иначе я бы принял это как ответ на вопрос.
Редактировать: как указано в комментарии выше, я также использовал @Primary
для Service1. Таким образом, мне нужно только пометить ввод с помощью SpecialService1 с помощью @Qualifier