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 }
- 与AsyncRestTemplate Netty客户端的Spring启动失败
- Kotlin + SpringBoot 2.0.0-M4失败tu加载应用程序上下文(BeanCreationException)
- Spring Data JPA:处理其他实体的继承属性
- 如何在eclipse maven web项目中编译kotlin
- 在Grails中可以使用Kotlin吗?
- Kotlin弹簧安全配置
- 如何让黄瓜让Spring注入一步定义类?
- Spring Boot 2&Spring 5错误服务index.html
- Spring Data JPA + Guice错误:使用@EnableTransactionManagement注解时,没有类型的主要bean定义