Внедрение в конструктор bean с пользовательской аннотацией - PullRequest
0 голосов
/ 22 февраля 2020

Я хотел бы добавить боб (назовем его clientStub) в мой service бин.

Для этого есть два требования:

  • создать бин clientStub, мне нужен доступ к аннотации @Client, которая содержит важную информацию, которая используется для поиска соответствующей конфигурации в свойствах.
  • Она должна поддерживать внедрение на основе конструктора (и @Bean метод ввода параметров)

Ожидаемое использование:

@Autowired
public MyService(
        @Client("invoice-manager") InvoiceManagerClientStub clientStub,
        SomeOtherBean bean1, ...) {

или

@Bean
MyService myService(
        @Client("invoice-manager") InvoiceManagerClientStub clientStub,
        SomeOtherBean bean1, ...) {

Поэтому я хотел бы сделать то же самое, что и аннотация @Value например, получить значение из аннотации к параметру (плюс некоторые внутренние поиски).

К сожалению, обычные BeanFactory s, кажется, не осведомлены о аннотациях цели.

Рассмотрены альтернативы

Использование BeanPostProcessor для ввода значений в аннотированные поля. Что ж, это то, чем я сейчас занимаюсь, но не имеет смысла иметь неизменный класс с одним установщиком для инъекции.

Инъекция в поле, а затем экспозиция в виде бина или вручную вызов конструктора еще хуже.

Создание прокси-экземпляра внедренного класса. Это невозможно, поскольку внедренные классы создаются + окончательно и не являются частью моей библиотеки.

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

Non-Goals

Перезапись любых основных bean-компонентов. Я хотел бы распространять расширение как библиотеку (на основе Spring-boot), поэтому следует избегать любой чрезмерной замены внутренних bean-компонентов Spring.

TLDR

Как сделать Я говорю Spring, чтобы разрешить параметр, используя значение моей аннотации (resolver)?

...