spring - 尾随 lambda 的上下文
问题描述
您可以在下面看到尾随的 lambda 语法:
runApplication</*... */>(/*... */) {
setBannerMode(/*... */)
}
我理解我们可以在括号外传递一个 lambda 作为最后一个参数的想法。但是上面的代码实际上做了什么?setBannerMode
是一种将覆盖父类中的方法的方法,不是吗?如果是,父级是什么班级?this
尾随 lambda 的大括号之间是否有一些上下文?一般来说,那里发生了什么?
代码来自这里
解决方案
setBannerMode 是一个被覆盖的方法,不是吗?
不,您正在做的是将 lambda 传递给runApplication()
具有this
隐式接收器的。
inline fun <reified T : Any> runApplication(vararg args: String, init: SpringApplication.() -> Unit): ConfigurableApplicationContext =
SpringApplication(T::class.java).apply(init).run(*args)
这init: SpringApplication.() -> Unit
是带有隐式接收器的 lambda 的定义。这意味着在 lambda 内部,this
将是一个SpringApplication
.
分解它:
SpringApplication(T::class.java)
- 创建一个新的 spring 应用程序。T
是由 Kotlin 编译器从调用上下文中计算出来的(这就是reified T
意思)。apply(init)
. 调用您的 lambda (init
),并将SpringApplication
用作接收者(适用于应用的 Kotlin 文档)。- 使用 varargs 参数调用
SpringApplication
'srun()
函数。此函数返回一个ConfigurableApplicationContext
.
因此,您正在调用setBannerMode()
实例化SpringApplication
对象的方法。
推荐阅读
- python - 如何在python中使用beautifulsoup在python中循环url
- c# - 如何按照接收时间降序接收消息
- python - 从 Python 编写 VTK 文件以在 Paraview 中使用
- authentication - 检查用户是否在 .net Core 2.2 中通过 Windows 身份验证
- postgresql - postgres查询中的多个命名窗口
- python - 处理带有 spacy 的 Document 的子集
- r - 以闪亮的方式访问 server() 不同部分的数据
- node.js - 从未调用过 cb() !来自 npm 的错误
- pandas - 如何在熊猫数据框中创建条形图?
- spring-boot - Spring Boot 2.0.2 Spring Security 如何禁用两个端点的自定义表单登录