Spring Boot - переопределить компонент от контроллера - PullRequest
1 голос
/ 09 марта 2020
  1. У меня есть два контроллера ( ControllerA и ControllerB )

  2. Оба контроллера вызывают службу ( MyService ).

  3. MyService вызывает интерфейс MyRepository , который имеет две реализации ( FirstRepository и SecondRepository ).

Как можно использовать FirstRepository , когда служба ( MyService ) вызывается из ControllerA и используйте SecondRepository , когда вызов поступает от ControllerB ?

Таким образом, я могу повторно использовать MyService , и какой репозиторий используется из Spring Configuration.

Ответы [ 3 ]

1 голос
/ 09 марта 2020

Я вижу два возможных решения здесь. 1. В вашем классе MyService автоматическое связывание обеих реализаций с аннотацией @Qualifier (вы также можете автоматически связать List. Тогда у метода MyService будет параметр, указывающий, какая реализация MyRepository должна быть вызвана. Я бы не рекомендовал это решение. 2. Определите две реализации MyService. (FirstService, SecondService.) Затем FirstService автоматически подключит FirstRepository, а SecondService автоматически подключит SecondRepository (используйте @Qualifier annotation again. Теперь вы можете легко внедрить FirstService в ControllerA и SecondService в ControllerB.

Но сначала я бы подумал об архитектуре. Может быть, вам не нужны отдельные контроллеры?

0 голосов
/ 09 марта 2020

Я закончил тем, что создал два контроллера и определил два класса @Configuration, по одному для каждого @Controller.

И с помощью аннотаций @Qualifier определил два набора bean-компонентов, а затем в каждом контроллере позволил Spring знаю, какой бин @Qualified я хочу внедрить.

@RestController
@RequestMapping("/v1/inapp/purchases")
class AController(
  @Qualifier("appStore") private val redeemPurchaseService: RedeemPurchaseService
) : RedeemPurchaseApiDocumentation { // More code }

И другой контроллер

@RestController
@RequestMapping("/v1/inapp/purchases")
class GPlayRedeemPurchaseController(
  @Qualifier("gplay") private val redeemPurchaseService: RedeemPurchaseService
) : RedeemPurchaseApiDocumentation { // More code }

И два @Configuration файла, по одному на контроллер.

0 голосов
/ 09 марта 2020

Проверяли ли вы аннотации @ Primary или @ Resource или @ Qualifier ? На основании ваших требований вы можете выбрать из них.

Нечто подобное уже обсуждалось здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...