如何在Kotlin中使用@Autowired之类的弹簧注释?


81

是否可以在Kotlin中执行以下操作?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient

3
你有没有尝试过?并且更具建设性..有一个完整的Spring Boot模板,答案肯定是“是”。
mabi

@mabi感谢您的教程链接:)
eendroroy

Answers:


182

在Spring中进行依赖注入的推荐方法是构造函数注入:

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

在Spring 4.3之前的版本中,构造函数应使用显式注释Autowired

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

在极少数情况下,您可能希望使用字段注入,并且可以在以下帮助下进行lateinit

@Component
class YourBean {

    @Autowired
    private lateinit var mongoTemplate: MongoTemplate

    @Autowired
    private lateinit var solrClient: SolrClient
}

构造函数注入在bean创建时检查所有依赖关系,并且所有注入的字段为val,另一方面lateinit注入的字段只能为var,并且运行时开销很小。并且使用构造函数测试类,您不需要反射。

链接:

  1. 关于Lateinit的文档
  2. 有关构造函数的文档
  3. 使用Kotlin开发Spring Boot应用程序

可以@Autowired与主构造函数参数一起使用吗?
Asif Mushtaq

当然,在第二个和第三个示例中,我将主构造函数用于注入。
罗斯兰

您还可以添加autowiredby setter吗?
Asif Mushtaq

@IRus,您在示例中使用了私有val,但是我要说的是,在Kotlin上,我在Internet上发现的所有示例中有80%没有“ private”修饰符。那将被认为是Java中的代码味道。是什么原因呢?你碰巧知道吗?我什至认为这值得一个单独的问题。
yuranos '18

@ yuranos87想象一下,如果将依赖项公开(Kotlin中的默认修饰符),开发人员可以在()中使用依赖项,那么开发人员会YourBeanFooBean中注入。但这是不允许的,因为依赖关系不是他的公共合同,而只是实现细节(在大多数情况下)。相反,应该在自己的构造函数中定义自己的依赖项。YourBeanYourBeanFooBeanyourBean.mongoTemplateYourBeanFooBean
罗斯兰

6

是的,在Kotlin中支持Java注释的方式与在Java中一样。一个陷阱是在主构造函数上的注释需要显式的“ constructor”关键字:

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

如果需要注释一个类的主要构造函数,则需要在构造函数声明中添加Constructor关键字,并在其之前添加注释:

class Foo @Inject constructor(dependency: MyDependency) {
  // ...
}

4

您还可以通过构造函数自动关联依赖项。记得用@Configuration, @Component, @Serviceetc注释你的依赖

import org.springframework.stereotype.Component

@Component
class Foo (private val dependency: MyDependency) {
    //...
}

0

像那样

@Component class Girl( @Autowired var outfit: Outfit)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.