Я хотел бы добавить боб (назовем его 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)?