11.18 Spring 5.0对Kotlin的支持

Kotlin 关键性能之一就是能与 Java 库很好地互用。但要在 Spring 中编写惯用的 Kotlin 代码,还需要一段时间的发展。 Spring 对 Java 8 的新支持:函数式 Web 编程、bean 注册 API , 这同样可以在 Kotlin 中使用。

Kotlin 扩展是Kotlin 的编程利器。它能对现有的 API 实现非侵入式的扩展,从而向 Spring中加入 Kotlin 的专有的功能特性。

11.18.1 一种注册 Bean 的新方法

Spring Framework 5.0 引入了一种注册 Bean 的新方法,作为利用 XML 或者 JavaConfig 的 @Configuration 或者 @Bean 的替代方案。简言之就是 Lambda 表达式。

例如用 Java 代码我们会这样写:

  1. GenericApplicationContext context = new GenericApplicationContext();
  2. context.registerBean(Foo.class);
  3. context.registerBean(Bar.class, () -> new
  4. Bar(context.getBean(Foo.class))
  5. );

而使用 Kotlin 我们可以将代码写成这样:

  1. val context = GenericApplicationContext {
  2. registerBean<foo>()
  3. registerBean { Bar(it.getBean<foo>()) }
  4. }

11.18.2 Spring Web 函数式 API

Spring 5.0 中的 RouterFunctionDsl 可以让我们使用干净且优雅的 Kotlin 代码来使用崭新的 Spring Web 函数式 API:

  1. fun route(request: ServerRequest) = RouterFunctionDsl {
  2. accept(TEXT_HTML).apply {
  3. (GET("/user/") or GET("/users/")) { findAllView() }
  4. GET("/user/{login}") { findViewById() }
  5. }
  6. accept(APPLICATION_JSON).apply {
  7. (GET("/api/user/") or GET("/api/users/")) { findAll() }
  8. POST("/api/user/") { create() }
  9. POST("/api/user/{login}") { findOne() }
  10. }
  11. } (request)

11.18.3 Reactor Kotlin 扩展

Reactor 是 Spring 5.0 中提供的响应式框架。而 reactor-kotlin 项目则是对 Reactor 中使用Kotlin 的支持。目前该项目正在早期阶段。

11.18.4 基于 Kotlin脚本的 Gradle 构建配置

之前我们的 Gradle 构建配置文件都是用Groovy 来编写的,这导致我们基于 Gradle 的 Kotlin 工程还要配置 Groovy 的语法的构建配置文件。

在gradle-script-kotlin 项目中,我们可以直接用 Kotlin 脚本来编写 Gradle 的构建配置文件了。而且 IDE 还为我们提供了在编写配置文件过程中的自动完成功能和重构功能的支持。

11.18.5 基于模板的 Kotlin 脚本

从 4.3 版本开始,Spring 提供了一个 ScriptTemplateView,用于利用支持 JSR-223 的脚本引擎来渲染模板。 Kotlin 1.1-M04 提供了这样的支持,并支持渲染基于 Kotlin 的模板,类似下面这样:

  1. import io.spring.demo.User
  2. import io.spring.demo.joinToLine
  3. """
  4. ${include("header", bindings)}
  5. <h1>Title : $title</h1>
  6. <ul>
  7. ${(users as List<User>).joinToLine{ "<li>User ${it.firstname} ${it.lastname}</li>" }}
  8. </ul>
  9. ${include("footer")}
  10. """