Мое приложение использует файл конфигурации (проанализированный как @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>)
. Можно ли предоставить аргументы, которые могут отсутствовать в сигнатуре реализации компонента? Я знаю, что вы можете сделать их необязательными в том смысле, что сайт вызова не может предоставить их, но как насчет другого способа?