Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在kotlin中使用像@Autowired这样的spring注释?_Spring_Kotlin - Fatal编程技术网

如何在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) {
        //...
    }