春天& kotlin:构造函数和lateinit注入有什么区别?

时间:2017-08-27 14:00:30

标签: spring spring-boot kotlin

我的应用程序使用spring和kotlin有问题。一开始我有一个控制器和一个这样的服务:

这是服务:

@Service
class StuffService {

    @Inject
    lateinit var environment : Environment

    fun doStuff() = [HERE FUNCTION CODE USING environment VARIABLE]

}

这是控制器:

@RestController
class StuffController {

    @Inject
    lateinit var stuffService : StuffService

    @RequestMapping("/doStuff")
    fun doStuff() = stuffService.doStuff()

}

不幸的是,当我启动springboot时,这给了我这个错误:

kotlin.UninitializedPropertyAccessException: lateinit property environment has not been initialized

所以我尝试通过构造函数注入:

@Service
class StuffService(val environment : Environment) {...}

@RestController
class StuffController(val stuffService: StuffService) {...}

使用tha代码可以正常工作!我没有错误。

我想知道有什么区别。我不明白发生了什么。谁能帮助我理解?

2 个答案:

答案 0 :(得分:0)

我用以下版本对此进行了测试:

kotlinVersion = '1.2.20'
springBootVersion = '2.0.1.RELEASE'

lateinit var注射似乎在我的情况下正常工作。

以下是一个示例项目供您参考:https://github.com/jivimberg/lateinit

答案 1 :(得分:0)

我怀疑您在初始化environment变量之前就已经引用它,这就是例外的原因。

更改后它起作用了。这是因为environment变量是在主构造函数中初始化的。您可能想知道它没有注释如何工作。根据此doc

  

从Spring Framework 4.3开始,具有单个构造函数的类的参数会自动自动装配,这就是为什么在上面显示的示例中不需要显式@Autowired构造函数的原因。