Разрешить реализации бина не определять аргументы, предоставляемые getBean - PullRequest
0 голосов
/ 23 апреля 2020

Мое приложение использует файл конфигурации (проанализированный как @ConfigurationProperties) для запуска нескольких сетевых потоков с различными службами / процессорами в них. Хорошей аналогией была бы настройка конвейеров канала Netty из внешнего конфига.

Свойства YAML выглядят так:

streams:
- type: tcp-server
  port: 2000
  services:   # this is the tricky part
  - type: watchdogTimer
  - type: someFormatConverter
  - type: dbLogger
    options: 
    - table: "things"

Я хочу, чтобы сервисы были легко определены, созданы и расположены. Поэтому я решил использовать Spring в качестве реестра для них - они могут быть объектами Spring в области прототипов, type - это имя Spring Bean, и они создаются следующим образом:

// Kotlin language
@Autowired
private lateinit var appContext: ApplicationContext

fun createStreamService(stream: MyStream, type: String, options:Map<String,String>): MyStreamService {
  return appContext.getBean(type, stream, options) as MyStreamService
}

Моя проблема в том, что даже если служба мне не нужна ссылка на поток или параметры, я все еще должен иметь их в конструкторе (stream:MyStream, options:Map<String,String>). Можно ли предоставить аргументы, которые могут отсутствовать в сигнатуре реализации компонента? Я знаю, что вы можете сделать их необязательными в том смысле, что сайт вызова не может предоставить их, но как насчет другого способа?

1 Ответ

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

В случае, если лучшего решения не будет, я собираюсь передать один объект, инкапсулирующий все аргументы (поток и параметры).

Несмотря на то, что все еще применяется принудительная реализация сигнатуры конструктора реализации, она более краткая и оставляет пространство для расширения без нарушения совместимости.

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