如何在kotlin中使用像@Autowired这样的弹簧注释?

问题描述 投票:45回答:2

是否有可能在Kotlin做类似的事情?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient
spring kotlin
2个回答
105
投票

肯定这是可能的,你有几个选项,我建议使用带注释的构造函数,但是lateinit也可以工作,在某些情况下可能有用:

晚初始化:

@Component
class YourBean {

    @Autowired
    lateinit var mongoTemplate: MongoTemplate

    @Autowired
    lateinit var solrClient: SolrClient
}

构造函数:

@Component
class YourBean @Autowired constructor(
    private val mongoTemplate: MongoTemplate, 
    private val solrClient: SolrClient
) {
  // code
}

Spring 4.3的构造函数:

@Component
class YourBean(
    private val mongoTemplate: MongoTemplate, 
    private val solrClient: SolrClient
) {
  // code
}

构造函数版本检查bean创建时的所有依赖关系以及所有注入的字段 - val,另一方面,lateinit注入的字段只能是var,并且运行时占用空间很小。要使用构造函数测试类,您不需要反射。

链接:

  1. Documentation on lateinit
  2. Documentation on constructors
  3. Developing Spring Boot applications with Kotlin

5
投票

是的,Kotlin支持Java注释,主要是在Java中。一个问题是主构造函数上的注释需要显式的'constructor'关键字:

来自https://kotlinlang.org/docs/reference/annotations.html

如果需要注释类的主要构造函数,则需要将constructor关键字添加到构造函数声明中,并在其前面添加注释:

class Foo @Inject constructor(dependency: MyDependency) {
  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.