Можете ли вы включить компонент в определенный класс c? - PullRequest
0 голосов
/ 11 апреля 2020

Возможно ли, чтобы bean-компонент был доступен только во время создания специфицированного c bean / class?

Это для клиента Feign, так как он работает, вы определяете интерфейс:

interface ClientA {
   // feign declarations
}

interface ClientB {
   // feign declarations
}

И добавить к нему несколько аннотаций, а затем стартер сканирует путь к классам для этих аннотаций и генерирует классы в виде bean-компонентов ClientA и ClientB. В моем классе конфигурации я могу создать bean-компонент:

ClientAConfig. java:

@Bean
public ReactiveHttpRequestInterceptor r1() {
}

ClientBConfig. java:

@Bean
public ReactiveHttpRequestInterceptor r2() {
}

Прямо сейчас, с инструкциями трассировки:

  • ClientA -> r1 -> r2
  • ClientB -> r2 -> r1

Очевидно, я хочу, чтобы ClientA использовал только r1 и ClientB использовать только r2. Как это работает сейчас, кажется, что bean-объекты-перехватчики являются глобальными.

С Feign я не создаю фактические классы, просто объявляю интерфейсы, поэтому я вообще не могу комментировать реализацию. Глядя на код, даже не ясно, как они полностью подключены стартером, так как вручную подключенный не работает полностью, но как часть компоновщика, вы можете указать перехватчик специально, без использования глобальных компонентов ... просто не могу заставить строителя работать полностью.

1 Ответ

0 голосов
/ 11 апреля 2020

Как насчет создания собственного класса, который расширяет Some3rdPartyWebClient, тогда вы можете использовать @Qualifier для указания c компонентов ввода или даже управлять им самостоятельно в классе @Configuration.

  1. @Component
    public class MyWebClient1 extends Some3rdPartyWebClient {
    
        @Autowired()
        @Qualifier("interceptor1")
        private Interceptor interceptor1;
    
    }
    
  2. @Bean(value = "interceptor1")
    public Interceptor createInterceptor1() {
    
        return new Interceptor();
    
    }
    
    @Bean(value = "myWebClient1")
    public MyWebClient1 createMyWebClient1() {
    
        MyWebClient1 myWebClient1 = new MyWebClient1();
        myWebClient1.setInterceptor1(createInterceptor1());
    
    }
    

После обновления Вопрос:

Поскольку область действия по умолчанию для бинов является одноэлементной в том же ApplicationContext, я думаю, что бин не может только видимо некоторыми указанными c bean-компонентами, если они находятся в одном и том же контейнере, поэтому вам может потребоваться создать другой контейнер для этой цели. Но это не может быть хорошим решением.

Вы пытались использовать Feign.builder () для настройки клиента на основе интерфейса и использовать addInterceptor () для добавления специфических c перехватчиков, которые нужны каждому клиенту?

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