在科特林自动接线

时间:2019-04-30 09:17:57

标签: java spring kotlin

我之前曾问过这个问题,但是从来没有任何有意义的答案。

如果我可以在Java Spring中用@Service注释ServiceClass

@Autowired
private ServiceClass serviceClass;

或更好

private final ServiceClass serviceClass;

public userManagementClass(ServiceClass serviceClass) {
        this.serviceClass = serviceClass;
    }

然后我换成了Kotlin,然后。

@Autowired
private lateinit var addressRepository: AddressRepository

使用@Repository注释AddressRepository的位置很好,但现在第一个使用@Service的ServiceClass

@Autowired
private lateinit var serviceClass: ServiceClass

@Autowired constructor(
      private val serviceClass: ServiceClass
)

都给出错误No beans of type found 我现在是否需要在Kotlin中为我的服务使用构造函数?

我读过许多标题为“了解Kotlin Lateinit”的文章,但不是,但我认为我仍然缺少一些核心思想,因为它们都没有任何该死的意义... Kotlin文档是不错的,但仅适用于您已经知道..否则也很混乱。

编辑似乎表明,给ServiceClass构造函数也没有做任何事情

1 个答案:

答案 0 :(得分:3)

在kotlin(以及我认为的Java)中,您可以像这样将依赖项注入到构造函数中:

import org.springframework.stereotype.Repository
import org.springframework.stereotype.Service

@Service
class ServiceClass constructor(
    private val repository: AddressRepository
) {
    // Do stuff here
}

@Repository
class AddressRepository

与以下相同:

@Service
class ServiceClass {
    @Autowired
    private lateinit var repository: AddressRepository

    // Do stuff here
}

@Repository
class AddressRepository

但是它允许您在不需要Spring Context(@SpringBootTest)的情况下进行单元测试。

然后,您可以通过其他相同方式注入服务

@Service
class OtherService constructor(
    private val service: ServiceClass
) {
    // Other stuff here
}

对于我来说,此代码没有bean问题。 (IntelliJ 2019.1.1)