和小鸟一起 – 5. 春季启动

解释

在使用Java开发Web应用程序时,通常会使用一些框架。其中,Spring框架提供了许多功能,方便开发使用。

然而,随着发布的进行,各种组件的添加使得它变得庞大而复杂。对于想要开始的新人来说,可能会觉得困难。

能够帮你消除这样的障碍物的是「Spring Boot」。

Spring Boot是一个轻量级框架,大部分负责构建基于Spring Framework的应用程序的工作。它可以简化复杂的Spring Framework的起步过程。

顺便说一句,在Spring Framework 5中正式支持Kotlin作为核心部分,我想尝试用Kotlin来创建Spring Boot应用程序。

仅需提供一种选项,以下为个中原因

我在下述环境中工作。

項目内容OSMacOSJDK1.8.0_152Gradle4.3.1Kotlin1.2.10Spring Boot1.5.9IDEIntelliJ IDEA

步驟

1. 构建.gradle文件

首先,创建 build.gradle 文件。

1.1. 构建脚本

使用 Kotlin 和 Spring Boot,配置最新的发布版本。

設定項目バージョンKotlin1.2.10Spring Boot1.5.9.RELEASE
buildscript {
    ext {
        kotlinVersion = '1.2.10'
        springBootVersion = '1.5.9.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
        classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
    }
}

我們正在添加 kotlin-allopen 作為依賴庫。
在 Kotlin 中,由於類別被定義為 final,預設無法使用使用 Spring 的 Autowired 注解。為了讓類別可以被繼承和重寫,必須在定義類別時加上 open 修飾符。
由於在所有目標上都加上 open 是很麻煩的,所以有個外掛可以隱式地將 open 加上,那就是 kotlin-allopen。

1.2. 使用插件

加载下一个要使用的插件。

apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

Kotlin-Spring 可以将带有 Spring 注解的类设置为 open。

1.3. JAR 任务

在 JAR 任务中指定要存档的 JAR 文件名。

jar {
    baseName = 'kotlinboot'
}

在这里,我们将其命名为kotlinboot。

1.4. 依赖库

设置所需的库以运行Spring Boot和Kotlin。
本次创建的Spring Boot应用程序将使用Thymeleaf来创建页面。因此,我们添加了org.springframework.boot:spring-boot-starter-thymeleaf。

dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    compile('org.springframework.boot:spring-boot-devtools')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")
    compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

2. 春季引导 Kotlin 源代码

接下来,我们将使用Kotlin为Spring Boot编写源代码。

2.1. SpringBootApplication 主类

创建一个带有@SpringBootApplication注解的启动类。

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication

@SpringBootApplication
open class Application {
    companion object {
        @JvmStatic fun main(args: Array<String>) {
            SpringApplication.run(Application::class.java, *args)
        }
    }
}

在 Spring Framework 的库中,对于使得该 main 方法可以进行静态调用,与在 Java 中创建时相比,有以下的变更。

#変更点内容1open 修飾子ここでは付けているが kotlin-allopen を参照しているので実はつける必要はない2companion objectJava から Kotlin の 関数を Companionオブジェクトのメンバ関数として呼び出し
Application.Companion.main() として呼び出し3@JvmStaticCompanion オブジェクトのメンバ関数を static 呼び出し
Application.main() として呼び出し

2.2. 春季MVC控制器

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.RequestMapping
import com.shinyay.sample.springboot.demokotlin.model.fizzBuzzLambda

@Controller
class MainController {
    @GetMapping
    fun index(model: Model): String {
        val fizzbuzz = fizzBuzzLambda(50)
        model.addAttribute("message", fizzbuzz)
        return "index"
    }
}

根据接收到的请求路径,在带有注解的函数中进行处理。在这里,当访问根路径时,将调用index函数。
将消息放入模型中,并返回index。
因此,将查找/resources/templates/index.html Thmeleaf模板文件。

2.3. Thmeleaf 模板

对于以下模板文件,将控制器生成的模型中的消息填充并展示。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Sample Application</h1>
<pre th:text="${message}">message</pre>
</body>
</html>

3. “FizzBuzz” 网红饮料

模型中存储的消息是使用Kotlin实现FizzBuzz并输出结果。

fun fizzBuzzLambda(n: Int): String {
    val fizz = { i: Int -> if (i % 3 == 0) "Fizz" else "" }
    val buzz = { i: Int -> if (i % 5 == 0) "Buzz" else "" }
    val number = { i: Int -> if (i % 3 != 0 && i % 5 != 0) i else "" }
    return generateSequence(1) { it + 1 }.map {fizz(it) + buzz(it) + number(it)}.take(n).joinToString("\n")
}

总结

我通过使用Kotlin还是能够像Java一样使用Spring Boot创建应用程序的感觉。

这次的资源

    shinyay/kotlin-basics 1.0.0
bannerAds