【问题标题】:Injecting Spring Boot properties into Kotlin Singleton / object将 Spring Boot 属性注入 Kotlin Singleton / object
【发布时间】:2019-03-18 02:34:00
【问题描述】:
我有一个 Spring Boot 2 项目,我正在使用 Kotlin。我想要实现的是拥有一个 Kotlin 单例(即一个对象)并注入 Spring 属性。
通常,我会使用构造函数注入来执行此操作,这是首选方式。但是,对于对象,构造函数是不允许的。另一种选择是使用lateinit var 与@Value("\${my.property.name}") 结合使用,但我必须初始化字段或显式设置类型。
我找不到这方面的示例或类似情况,所以我很好奇这个用例所需的方法是什么。
【问题讨论】:
标签:
spring-boot
kotlin
singleton
【解决方案1】:
从技术上讲,您可以这样做:
object MyObject {
lateinit var foo: String
}
@Configuration
class BeanConfiguration {
@Bean
fun myObject(): MyObject {
return MyObject.also {
it.foo = "foo"
}
}
}
但我不推荐这种方法,因为它看起来像代码异味。最好使用简单的 classes,因为 Spring 保证使用 @Bean 注释的方法只会被调用一次(如果它们没有原型作用域)。
由于objects 不需要创建,因此您可以根据需要管理其自己的生命周期,您无需将所有东西都放在 Spring 中。