和小鸟一起 – 5. 春季启动
解释
在使用Java开发Web应用程序时,通常会使用一些框架。其中,Spring框架提供了许多功能,方便开发使用。
然而,随着发布的进行,各种组件的添加使得它变得庞大而复杂。对于想要开始的新人来说,可能会觉得困难。
能够帮你消除这样的障碍物的是「Spring Boot」。
Spring Boot是一个轻量级框架,大部分负责构建基于Spring Framework的应用程序的工作。它可以简化复杂的Spring Framework的起步过程。
顺便说一句,在Spring Framework 5中正式支持Kotlin作为核心部分,我想尝试用Kotlin来创建Spring Boot应用程序。
仅需提供一种选项,以下为个中原因
我在下述环境中工作。
步驟
1. 构建.gradle文件
首先,创建 build.gradle 文件。
1.1. 构建脚本
使用 Kotlin 和 Spring Boot,配置最新的发布版本。
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 中创建时相比,有以下的变更。
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