是否可以在Kotlin中执行以下操作?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Answers:
在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
,并且运行时开销很小。并且使用构造函数测试类,您不需要反射。
链接:
@Autowired
与主构造函数参数一起使用吗?
autowired
by setter吗?
YourBean
在FooBean
中注入。但这是不允许的,因为依赖关系不是他的公共合同,而只是实现细节(在大多数情况下)。相反,应该在自己的构造函数中定义自己的依赖项。YourBean
YourBean
FooBean
yourBean.mongoTemplate
YourBean
FooBean
是的,在Kotlin中支持Java注释的方式与在Java中一样。一个陷阱是在主构造函数上的注释需要显式的“ constructor”关键字:
来自https://kotlinlang.org/docs/reference/annotations.html
如果需要注释一个类的主要构造函数,则需要在构造函数声明中添加Constructor关键字,并在其之前添加注释:
class Foo @Inject constructor(dependency: MyDependency) {
// ...
}