前言:本文将向您展示了如何结合Spring Boot和Kotlin的强大功能,高效地构建一个博客系统。如果您从Kotlin开始,您可以通过阅读参考文档、遵循Kotlin Koans在线教程或者仅仅使用Spring Framework参考文档(现在提供了Kotlin的代码示例)来学习这门语言。
源码:s.ymzan.top
Spring Framework和Spring Boot参考文档中记录了Spring Kotlin支持。如果您需要帮助,可以在StackOverflow上搜索spring和kotlin标签,或者在kotlin Slack的#spring频道进行讨论。
一、创建新项目
首先,我们需要创建Spring Boot应用程序,这可以通过多种方式实现。
使用Initializr网站
选择Kotlin语言。Gradle是Kotlin中最常用的构建工具,它提供了一个Kotlin DSL,在生成Kotlin项目时默认使用,所以这是推荐的选择。但是,如果您对Maven比较熟悉,也可以使用它。注意,您可以使用Gradle -project默认选择Kotlin和Gradle。
1、选择“Gradle Project”或者让默认的“Maven Project”,这取决于你想要使用的构建工具;
2、输入以下工件坐标:blog;
3、添加以下依赖项:Spring Web、Mustache、Spring Data JPA、H2 Database和Spring Boot DevTools;
4、单击“生成项目”。
zip文件在根目录中包含一个标准项目,因此您可能希望在解包之前创建一个空目录。
二、使用命令行
你可以在命令行中使用Initializr HTTP API,例如,在UN*X之类的系统上使用curl:如果你想使用Gradle,添加-d type= Gradle -project。
$ mkdir blog && cd blog
$ curl start.spring.io/starter.zip -d language=kotlin -d dependencies=web,mustache,jpa,h2,devtools -d packageName=com.example.blog -d name=Blog -o blog.zip
三、使用IntelliJ IDEA
Spring Initializr也集成在IntelliJ IDEA Ultimate版中,允许你创建和导入一个新项目,而不需要离开IDE使用命令行或web UI。
要访问向导,转到文件|新建|项目,并选择Spring Initializr。
按照向导的步骤使用以下参数:工件:“博客”,类型:Maven项目或Gradle项目,语言:芬兰湾的科特林,名称:“博客”和依赖项:“Spring Web Starter”,“Mustache”,“Spring Data JPA”,“H2 Database”和“Spring Boot DevTools”。
四、理解Gradle构建
如果您正在使用Maven Build,您可以跳到专门的部分。
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("plugin.jpa") version "1.4.32"
id("org.springframework.boot") version "2.4.4"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.4.32"
kotlin("plugin.spring") version "1.4.32"
}
插件
除了明显的Kotlin Gradle插件,默认配置声明了Kotlin - Spring插件,它会自动打开带有Spring注释的类和方法(与Java不同,Kotlin的默认限定符是final)或元注释的。这对于创建@Configuration或@Transactional bean非常有用,而不需要添加开放限定符(例如CGLIB代理所需)。
为了能够在JPA中使用Kotlin的非空属性,Kotlin JPA插件也被启用了。它为任何带有@Entity, @MappedSuperclass或@ embed注解的类生成无参数构造函数。
五、编译器选项
Kotlin的关键特性之一是空值安全——它在编译时干净地处理空值,而不是在运行时遇到著名的NullPointerException。通过声明可空性和表达“值或无值”语义,这使得应用程序更安全,而无需支付像Optional这样的包装器的成本。注意,Kotlin允许使用带有空值的函数结构;查看Kotlin零安全的全面指南。
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "1.8"
}
}
尽管Java不允许在它的类型系统中表达空安全,Spring框架通过在org.springframework.lang包中声明的工具友好的注释,为整个Spring框架API提供了空安全。默认情况下,Kotlin中使用的Java api的类型被识别为放松空检查的平台类型。Kotlin对JSR 305注解+ Spring空值性注解的支持,为Kotlin开发者提供了整个Spring框架API的空值安全性,并在编译时处理与空值相关的问题。
可以通过添加带有strict选项的-Xjsr305编译器标志来启用该特性。
还请注意,Kotlin编译器被配置为生成Java 8字节码(默认情况下是Java 6)。
六、依赖关系
三类Spring Boot web应用程序需要Kotlin特定库,并默认配置:Kotlin -stdlib-jdk8是Kotlin标准库的Java 8变体、Kotlin -reflect是Kotlin反射库和jackson-module-kotlin增加了对Kotlin类和数据类的序列化/反序列化的支持(可以自动使用单个构造函数类,也支持那些具有二级构造函数或静态工厂的类)。
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-mustache")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
runtimeOnly("com.h2database:h2")
runtimeOnly("org.springframework.boot:spring-boot-devtools")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
Spring Boot Gradle插件会自动使用通过Kotlin Gradle插件声明的Kotlin版本。
现在可以更深入地了解生成的应用程序。
七、理解Maven构建
除了明显的Kotlin Maven插件外,默认配置声明了Kotlin - Spring插件,该插件自动打开带有Spring注释的类和方法(与Java不同,Kotlin的默认限定符是final)或元注释。这对于创建@Configuration或@Transactional bean非常有用,而不需要添加开放限定符(例如CGLIB代理所需)。
为了能够在JPA中使用Kotlin的非空属性,Kotlin JPA插件也被启用了。它为任何带有@Entity, @MappedSuperclass或@ embed注解的类生成无参数构造函数。
<build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<compilerPlugins>
<plugin>jpa</plugin>
<plugin>spring</plugin>
</compilerPlugins>
<args>
<arg>-Xjsr305=strict</arg>
</args>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-noarg</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Kotlin的关键特性之一是空值安全——它在编译时干净地处理空值,而不是在运行时遇到著名的NullPointerException。通过声明可空性和表达“值或无值”语义,这使得应用程序更安全,而无需支付像Optional这样的包装器的成本。注意,Kotlin允许使用带有空值的函数结构;查看Kotlin零安全的全面指南。
尽管Java不允许在它的类型系统中表达空安全,Spring框架通过在org.springframework.lang包中声明的工具友好的注释,为整个Spring框架API提供了空安全。默认情况下,Kotlin中使用的Java api的类型被识别为放松空检查的平台类型。Kotlin对JSR 305注解+ Spring空值性注解的支持,为Kotlin开发者提供了整个Spring框架API的空值安全性,并在编译时处理与空值相关的问题。
可以通过添加带有strict选项的-Xjsr305编译器标志来启用该特性。
还请注意,Kotlin编译器被配置为生成Java 8字节码(默认情况下是Java 6)。
八、依赖关系
3 .此类Spring Boot web应用程序需要Kotlin特定库,并默认配置:Kotlin -stdlib-jdk8是Kotlin标准库的Java 8变体、Kotlin -reflect是Kotlin反射库(从Spring Framework 5开始是强制性的)和jackson-module-kotlin增加了对Kotlin类和数据类的序列化/反序列化的支持(可以自动使用单个构造函数类,也支持那些具有二级构造函数或静态工厂的类)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mustache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
九、理解生成的应用程序
与Java相比,您可以注意到缺少分号,空类上缺少括号(如果需要通过@Bean注释声明bean,可以添加一些括号),以及使用runApplication顶级函数。runApplication (*args)是SpringApplication.run(BlogApplication::class.java, *args)的Kotlin习惯替代品,可以用以下语法来定制应用程序。
package com.example.blog
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class BlogApplication
fun main(args: Array<String>) {
runApplication<BlogApplication>(*args)
}
十、编写您的第一个Kotlin控制器
让我们创建一个简单的控制器来显示一个简单的web页面。
package com.example.blog
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping
@Controller
class HtmlController {
@GetMapping("/")
fun blog(model: Model): String {
model["title"] = "Blog"
return "blog"
}
}
注意,我们在这里使用的是一个Kotlin扩展,它允许向现有的Spring类型添加Kotlin函数或操作符。这里我们导入了org.springframework.ui.set扩展函数,以便能够编写model["title"] = "Blog"而不是model。addAttribute(“标题”、“博客”)。Spring Framework KDoc API列出了所有为丰富Java API而提供的Kotlin扩展。
我们还需要创建相关的Mustache模板。
通过运行BlogApplication的主函数来启动web应用。kt,登陆http://localhost:8080/,你会看到一个严肃的网页,标题是"博客"
结论
我们现在已经完成了这个springboot博客系统的构建