Две возможности здесь:
Самый простой способ - заменить блок init
методом @PostConstruct
. Spring вызовет это один раз, после того, как объект будет построен (и, следовательно, все значения автопроводки установлены). Например:
@PostConstruct
private fun initialise() {
lib = Lib(someProperty)
}
Другой способ организовать передачу свойства autowired в конструкторе, а не в качестве свойства (согласно другим ответам).
Один подход, который работает хорошо, особенно если у вас есть несколько свойств конфигурации, - это иметь центральный класс, хранящий их:
@ConfigurationProperties("lib")
class ConfigProperties {
var someProperty = "defaultValue"
// …and other properties…
}
Это будет устанавливать someProperty
из значения "lib.someProperty" в файле конфигурации (или оставить как "defaultValue", если его нет).
Затем вы можете автоматически связать его экземпляр в конструкторе, например ::
class SomeService @Autowired constructor(
private val configProperties: ConfigProperties) {
init {
lib = Lib(configProperties.someProperty)
}
}
(Централизация свойств также может упростить поиск доступных свойств.)