Javax: расширение именованной службы

#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