![](/img/trans.png)
[英]What is difference between autowiring vs dependency injection in Spring?
[英]Spring & kotlin : What is the difference between constructor and lateinit injection?
我在使用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代码可以正常工作! 我没有错。
我不知道有什么区别。 我不明白发生了什么。 谁能帮我理解?
我使用以下版本进行了测试:
kotlinVersion = '1.2.20'
springBootVersion = '2.0.1.RELEASE'
在我的情况下, lateinit var
注入似乎运行良好。
这是一个示例项目供您参考: https : //github.com/jivimberg/lateinit
我怀疑您在初始化之前就引用了environment
变量,这就是例外的原因。
更改后它起作用了。 这是因为environment
变量是在主构造函数中初始化的。 您可能想知道它没有注释如何工作。 根据这份文件
从Spring Framework 4.3开始,具有单个构造函数的类的参数将自动自动装配,这就是为什么在上面显示的示例中不需要显式@Autowired构造函数的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.