Spring在Kotlin中注入了参考

在Kotlin中,一个变量必须在声明时初始化,除非它有? 附加到类型名称。 所以Spring的注入bean必须被声明为:

 @AutoWired var someService: SomeService? = null 

令人讨厌的是,从这里到处都有someService被使用,那么必须指定某种空安全逻辑,或者是直接的空检查。

当然我们可以这样做:

 @AutoWired var someService = new SomeService() 

但是这并不总是可能的,一次性的实例只是混淆。

我的问题是,无论如何告诉Kotlin这个变量将被初始化,实际上不是null

你有两个选择。

1)使用构造函数注入

在我看来,构造器注入是最好的方式,因为它明确声明必须设置依赖关系来构造对象。

2)宣布你的领域为lateinit

阅读文档中有关主题的更多信息: https : //kotlinlang.org/docs/reference/properties.html

后期初始化属性

通常,声明为具有非null类型的属性必须在构造函数中初始化。 但是,这往往不方便。 例如,属性可以通过依赖注入来初始化,或者在单元测试的设置方法中进行初始化。 在这种情况下,你不能在构造函数中提供一个非null初始值设定项,但是当你引用一个类的内部属性的时候,你还是要避免使用null检查。

 public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() // dereference directly } } 

Spring项目的官方建议是使用构造函数注入。 在Kotlin里它看起来像这样:

 @Service class GobblinMetricsConsumer( private val graphiteClient: GraphiteClient, private val parserService: JsonParserService, private val kafkaConfigurationProperties: KafkaConfigurationProperties ) { // code will go here }