如何在kotlin中使用像@Autowired这样的spring注释?
有可能在科特林做类似的事情吗如何在kotlin中使用像@Autowired这样的spring注释?,spring,kotlin,Spring,Kotlin,有可能在科特林做类似的事情吗 @Autowired internal var mongoTemplate: MongoTemplate @Autowired internal var solrClient: SolrClient 是的,Kotlin和java一样支持java注释。 一个问题是主构造函数上的注释需要显式的“constructor”关键字: 从 如果需要注释类的主构造函数,则需要将构造函数关键字添加到构造函数声明中,并在其前面添加注释: 在Spring中执行依赖项注入的推荐方法是
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
是的,Kotlin和java一样支持java注释。 一个问题是主构造函数上的注释需要显式的“constructor”关键字: 从 如果需要注释类的主构造函数,则需要将构造函数关键字添加到构造函数声明中,并在其前面添加注释:
在Spring中执行依赖项注入的推荐方法是构造函数注入:
@Component
class YourBean(
private val mongoTemplate: MongoTemplate,
private val solrClient: SolrClient
) {
// code
}
在Spring 4.3之前,构造函数应使用自动连线进行明确注释:
@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
,并且运行时开销很小。要使用构造函数测试类,不需要反射
链接:
还可以通过构造函数自动关联依赖项。记住用@Configuration、@Component、@Service
等注释依赖项
import org.springframework.stereotype.Component
@Component
class Foo (private val dependency: MyDependency) {
//...
}
那样
@组件类女孩(@Autowired-var-fight:fight)
如果您想要属性注入,但不喜欢lateinit var
,以下是我的解决方案:
private lateinit var ctx:ApplicationContext
@组成部分
私有类CtxVarConfigurer:ApplicationContextAware{
重写fun setApplicationContext(上下文:ApplicationContext){
ctx=上下文
}
}
自动连线(名称:字符串?=null)=自动连线(T::class.java,名称)
类自动连接(private-val-javaType:class,private-val-name:String?){
lazy的私有值{
if(name==null){
getBean(javaType)
}否则{
getBean(名称,javaType)
}
}
运算符fun getValue(thisRef:Any?,属性:KProperty):T=value
}
然后,您可以通过
委托语法使用更好的:
@服务
类MyService{
私有val serviceToBeInjected:serviceAby autowired()
私有val-ambiguousBean:AmbiguousService-by-autowired(“限定符”)
}
您试过了吗?更具建设性一点。。有一个完整的答案,答案肯定是“是”。@mabi谢谢你的教程链接:)我可以使用带有主构造函数参数的@Autowired
吗?当然,在第二个和第三个示例中,我使用主构造函数进行注入。你也可以通过setter添加Autowired
吗?@IRus,你在示例中使用了私有VAL,但我要说的是,我在互联网上找到的80%的例子在谈到Kotlin时都没有“private”修饰语。这在Java中被认为是代码气味。原因是什么?你知道吗?我甚至认为这值得一个单独的问题。@yuranos87想象开发者在FooBean
中注入YourBean
,以防YourBean
依赖项是公共的(Kotlin中的默认修饰符),开发者可以在FooBean
中使用YourBean
依赖项(YourBean.mongoTemplate
)。但这是不允许的,因为依赖项不是他的公共契约,它只是实现细节(在大多数情况下)。相反,FooBean
应该在自己的构造函数中定义自己的依赖项。不需要自动连线这里的构造函数关键字在哪里?
import org.springframework.stereotype.Component
@Component
class Foo (private val dependency: MyDependency) {
//...
}