Hướng dẫn này chỉ cho bạn cách xây dựng một ứng dụng blog mẫu hiệu quả bằng cách kết hợp sức mạnh của Spring Boot và Kotlin
Nếu bạn đang bắt đầu với Kotlin, bạn có thể học ngôn ngữ này bằng cách đọc tài liệu tham khảo, làm theo hướng dẫn Kotlin Koans trực tuyến hoặc chỉ sử dụng tài liệu tham khảo Spring Framework hiện cung cấp các mẫu mã trong Kotlin
Hỗ trợ Spring Kotlin được ghi lại trong tài liệu tham khảo Spring Boot và Spring Boot. Nếu bạn cần trợ giúp, hãy tìm kiếm hoặc đặt câu hỏi với các thẻ
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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
7 và 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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
8 trên StackOverflow hoặc tham gia thảo luận trong kênh 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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
9 của Kotlin SlackTạo một dự án mới
Đầu tiên chúng ta cần tạo một ứng dụng Spring Boot, có thể thực hiện theo một số cách
Sử dụng trang web Initializr
Truy cập https. //bắt đầu. mùa xuân. io và chọn ngôn ngữ Kotlin. Gradle là công cụ xây dựng được sử dụng phổ biến nhất trong Kotlin và nó cung cấp Kotlin DSL được sử dụng theo mặc định khi tạo dự án Kotlin, vì vậy đây là lựa chọn được đề xuất. Nhưng bạn cũng có thể sử dụng Maven nếu cảm thấy thoải mái hơn với nó. Lưu ý rằng bạn có thể sử dụng để chọn Kotlin và Gradle theo mặc định
Chọn "Gradle - Kotlin" hoặc "Maven" tùy thuộc vào công cụ xây dựng bạn muốn sử dụng
Nhập tọa độ hiện vật sau.
0spring.jpa.properties.hibernate.globally_quoted_identifiers=true spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
Thêm các phụ thuộc sau
web mùa xuân
Ria
Dữ liệu mùa xuân JPA
Cơ sở dữ liệu H2
Spring Boot DevTools
Nhấp vào "Tạo dự án"
Các. zip chứa một dự án tiêu chuẩn trong thư mục gốc, vì vậy bạn có thể muốn tạo một thư mục trống trước khi giải nén nó
Sử dụng dòng lệnh
Ví dụ, bạn có thể sử dụng API HTTP Initializr với curl trên hệ thống giống như UN*X
$ mkdir blog && cd blog
$ curl //start.spring.io/starter.zip -d language=kotlin -d type=gradle-project-kotlin -d dependencies=web,mustache,jpa,h2,devtools -d packageName=com.example.blog -d name=Blog -o blog.zip
Thêm
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
1 nếu bạn muốn sử dụng GradleSử dụng IntelliJ IDEA
Spring Initializr cũng được tích hợp trong phiên bản IntelliJ IDEA Ultimate và cho phép bạn tạo và nhập một dự án mới mà không cần phải thoát khỏi IDE cho dòng lệnh hoặc giao diện người dùng web
Để truy cập trình hướng dẫn, hãy chuyển đến Tệp. Mới. Project và chọn Spring Initializr
Làm theo các bước của trình hướng dẫn để sử dụng các tham số sau
hiện vật. "Blog"
Loại. "Gradle - Kotlin" hoặc "Maven"
Ngôn ngữ. Kotlin
Tên. "Blog"
phụ thuộc. "Trình khởi động web mùa xuân", "Mustache", "JPA dữ liệu mùa xuân", "Cơ sở dữ liệu H2" và "Công cụ dành cho nhà phát triển khởi động mùa xuân"
Hiểu bản dựng Gradle
Nếu bạn đang sử dụng Maven Build, bạn có thể
bổ sung
Ngoài plugin Kotlin Gradle rõ ràng, cấu hình mặc định khai báo tự động mở các lớp và phương thức [không giống như trong Java, vòng loại mặc định là
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
2 trong Kotlin] được chú thích hoặc siêu chú thích với các chú thích Spring. Điều này rất hữu ích để có thể tạo các hạt đậu spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
3 hoặc spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
4 mà không phải thêm từ hạn định spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
5 theo yêu cầu của các proxy CGLIB chẳng hạnĐể có thể sử dụng các thuộc tính không thể vô hiệu hóa của Kotlin với JPA, cũng được bật. Nó tạo ra các hàm tạo không có đối số cho bất kỳ lớp nào được chú thích bằng
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
6, spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
7 hoặc spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
8spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
Tùy chọn trình biên dịch
Một trong những tính năng chính của Kotlin là null-safety - giải quyết rõ ràng các giá trị
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
0 tại thời điểm biên dịch thay vì chạm vào giá trị nổi tiếng
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
1 tại thời điểm chạy. Điều này làm cho các ứng dụng an toàn hơn thông qua các tuyên bố về tính vô hiệu và thể hiện ngữ nghĩa "có giá trị hoặc không có giá trị" mà không phải trả chi phí cho các trình bao bọc như
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
2. Lưu ý rằng Kotlin cho phép sử dụng các cấu trúc chức năng có giá trị nullable; Mặc dù Java không cho phép một người thể hiện tính an toàn không có giá trị trong hệ thống kiểu của nó, nhưng Spring Framework cung cấp tính an toàn không có giá trị cho toàn bộ API Spring Framework thông qua các chú thích thân thiện với công cụ được khai báo trong gói
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
3. Theo mặc định, các loại từ API Java được sử dụng trong Kotlin được công nhận là loại kiểm tra null được nới lỏng. + Chú thích vô hiệu hóa mùa xuân cung cấp tính an toàn vô hiệu cho toàn bộ Spring Framework API cho các nhà phát triển Kotlin, với lợi thế là xử lý các vấn đề liên quan đến
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
0 tại thời điểm biên dịchTính năng này có thể được kích hoạt bằng cách thêm cờ trình biên dịch
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
5 với các tùy chọn
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
6spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
phụ thuộc
Cần có 2 thư viện dành riêng cho Kotlin [thư viện chuẩn được thêm tự động bằng Gradle] cho ứng dụng web Spring Boot đó và được định cấu hình theo mặc định
8 là thư viện phản chiếu Kotlin${project.basedir}/src/main/kotlin ${project.basedir}/src/test/kotlin org.springframework.boot spring-boot-maven-plugin org.jetbrains.kotlin kotlin-maven-plugin jpa spring -Xjsr305=strict org.jetbrains.kotlin kotlin-maven-noarg ${kotlin.version} org.jetbrains.kotlin kotlin-maven-allopen ${kotlin.version}
9 thêm hỗ trợ tuần tự hóa/giải tuần tự hóa các lớp Kotlin và lớp dữ liệu [các lớp hàm tạo đơn lẻ có thể được sử dụng tự động và những lớp có hàm tạo thứ cấp hoặc nhà máy tĩnh cũng được hỗ trợ]${project.basedir}/src/main/kotlin ${project.basedir}/src/test/kotlin org.springframework.boot spring-boot-maven-plugin org.jetbrains.kotlin kotlin-maven-plugin jpa spring -Xjsr305=strict org.jetbrains.kotlin kotlin-maven-noarg ${kotlin.version} org.jetbrains.kotlin kotlin-maven-allopen ${kotlin.version}
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9dependencies {
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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
Các phiên bản gần đây của H2 yêu cầu cấu hình đặc biệt để thoát đúng các từ khóa dành riêng như
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-mustache
org.springframework.boot
spring-boot-starter-web
com.fasterxml.jackson.module
jackson-module-kotlin
org.jetbrains.kotlin
kotlin-reflect
org.jetbrains.kotlin
kotlin-stdlib
org.springframework.boot
spring-boot-devtools
runtime
com.h2database
h2
runtime
org.springframework.boot
spring-boot-starter-test
test
1
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-mustache
org.springframework.boot
spring-boot-starter-web
com.fasterxml.jackson.module
jackson-module-kotlin
org.jetbrains.kotlin
kotlin-reflect
org.jetbrains.kotlin
kotlin-stdlib
org.springframework.boot
spring-boot-devtools
runtime
com.h2database
h2
runtime
org.springframework.boot
spring-boot-starter-test
test
2spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
Plugin Spring Boot Gradle tự động sử dụng phiên bản Kotlin được khai báo thông qua plugin Kotlin Gradle
Bây giờ bạn có thể lấy một
Hiểu bản dựng Maven
bổ sung
Ngoài plugin Kotlin Maven rõ ràng, cấu hình mặc định khai báo tự động mở các lớp và phương thức [không giống như trong Java, vòng loại mặc định là
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
2 trong Kotlin] được chú thích hoặc siêu chú thích với các chú thích Spring. Điều này rất hữu ích để có thể tạo các hạt đậu spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
3 hoặc spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
4 mà không phải thêm từ hạn định spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
5 theo yêu cầu của các proxy CGLIB chẳng hạnĐể có thể sử dụng các thuộc tính không thể vô hiệu hóa của Kotlin với JPA, cũng được bật. Nó tạo ra các hàm tạo không có đối số cho bất kỳ lớp nào được chú thích bằng
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
6, spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
7 hoặc spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
8package com.example.blog
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class BlogApplication
fun main[args: Array] {
runApplication[*args]
}
0
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
Một trong những tính năng chính của Kotlin là null-safety - giải quyết rõ ràng các giá trị
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
0 tại thời điểm biên dịch thay vì chạm vào giá trị nổi tiếng
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
1 tại thời điểm chạy. Điều này làm cho các ứng dụng an toàn hơn thông qua các tuyên bố về tính vô hiệu và thể hiện ngữ nghĩa "có giá trị hoặc không có giá trị" mà không phải trả chi phí cho các trình bao bọc như
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
2. Lưu ý rằng Kotlin cho phép sử dụng các cấu trúc chức năng có giá trị nullable; Mặc dù Java không cho phép một người thể hiện tính an toàn không có giá trị trong hệ thống kiểu của nó, nhưng Spring Framework cung cấp tính an toàn không có giá trị cho toàn bộ API Spring Framework thông qua các chú thích thân thiện với công cụ được khai báo trong gói
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
3. Theo mặc định, các loại từ API Java được sử dụng trong Kotlin được công nhận là loại kiểm tra null được nới lỏng. + Chú thích vô hiệu hóa mùa xuân cung cấp tính an toàn vô hiệu cho toàn bộ Spring Framework API cho các nhà phát triển Kotlin, với lợi thế là xử lý các vấn đề liên quan đến
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
0 tại thời điểm biên dịchTính năng này có thể được kích hoạt bằng cách thêm cờ trình biên dịch
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
5 với các tùy chọn
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
6Cũng lưu ý rằng trình biên dịch Kotlin được cấu hình để tạo Java 8 bytecode [Java 6 theo mặc định]
phụ thuộc
3 thư viện dành riêng cho Kotlin được yêu cầu cho ứng dụng web Spring Boot đó và được định cấu hình theo mặc định
8 là thư viện tiêu chuẩn của Kotlinpackage com.example.blog import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication @SpringBootApplication class BlogApplication fun main[args: Array] { runApplication[*args] }
8 là thư viện phản chiếu Kotlin${project.basedir}/src/main/kotlin ${project.basedir}/src/test/kotlin org.springframework.boot spring-boot-maven-plugin org.jetbrains.kotlin kotlin-maven-plugin jpa spring -Xjsr305=strict org.jetbrains.kotlin kotlin-maven-noarg ${kotlin.version} org.jetbrains.kotlin kotlin-maven-allopen ${kotlin.version}
9 thêm hỗ trợ tuần tự hóa/giải tuần tự hóa các lớp Kotlin và lớp dữ liệu [các lớp hàm tạo đơn lẻ có thể được sử dụng tự động và những lớp có hàm tạo thứ cấp hoặc nhà máy tĩnh cũng được hỗ trợ]${project.basedir}/src/main/kotlin ${project.basedir}/src/test/kotlin org.springframework.boot spring-boot-maven-plugin org.jetbrains.kotlin kotlin-maven-plugin jpa spring -Xjsr305=strict org.jetbrains.kotlin kotlin-maven-noarg ${kotlin.version} org.jetbrains.kotlin kotlin-maven-allopen ${kotlin.version}
package com.example.blog
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class BlogApplication
fun main[args: Array] {
runApplication[*args]
}
0
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-mustache
org.springframework.boot
spring-boot-starter-web
com.fasterxml.jackson.module
jackson-module-kotlin
org.jetbrains.kotlin
kotlin-reflect
org.jetbrains.kotlin
kotlin-stdlib
org.springframework.boot
spring-boot-devtools
runtime
com.h2database
h2
runtime
org.springframework.boot
spring-boot-starter-test
test
Hiểu ứng dụng được tạo
fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
2package com.example.blog
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class BlogApplication
fun main[args: Array] {
runApplication[*args]
}
So với Java, bạn có thể nhận thấy thiếu dấu chấm phẩy, thiếu dấu ngoặc trên lớp trống [bạn có thể thêm một số nếu bạn cần khai báo các bean thông qua chú thích
fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
3] và việc sử dụng hàm cấp cao nhất fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
4. fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
5 là thành ngữ Kotlin thay thế cho fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
6 và có thể được sử dụng để tùy chỉnh ứng dụng với cú pháp saufun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
2fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
Viết bộ điều khiển Kotlin đầu tiên của bạn
Hãy tạo một bộ điều khiển đơn giản để hiển thị một trang web đơn giản
fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
8package 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"
}
}
Lưu ý rằng chúng tôi đang sử dụng ở đây một tiện ích mở rộng Kotlin cho phép thêm các hàm hoặc toán tử của Kotlin vào các loại Spring hiện có. Ở đây chúng ta nhập hàm mở rộng
fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
9 để có thể viết 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"
}
}
0 thay vì 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"
}
}
1. Spring Framework KDoc API liệt kê tất cả các tiện ích mở rộng của Kotlin được cung cấp để làm phong phú thêm Java APIChúng ta cũng cần tạo các mẫu Mustache liên quan
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"
}
}
2import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
0package 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"
}
}
3import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
1package 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"
}
}
4import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
2Khởi động ứng dụng web bằng cách chạy chức năng
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"
}
}
5 của 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"
}
}
6, và đi đến 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"
}
}
7, bạn sẽ thấy một trang web tỉnh táo với tiêu đề "Blog"Thử nghiệm với JUnit 5
JUnit 5 hiện được sử dụng theo mặc định trong Spring Boot cung cấp nhiều tính năng khác nhau rất tiện dụng với Kotlin, bao gồm tính năng cho phép sử dụng các thuộc tính
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"
}
}
8 không thể vô hiệu hóa và khả năng sử dụng ____61_______9/import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
00 trên các phương thức không tĩnh thông thườngViết bài kiểm tra JUnit 5 trong Kotlin
Vì lợi ích của ví dụ này, hãy tạo một thử nghiệm tích hợp để chứng minh các tính năng khác nhau
Chúng tôi sử dụng các câu thực giữa các backticks thay vì camel-case để cung cấp các tên hàm kiểm tra biểu cảm
JUnit 5 cho phép thêm các tham số phương thức và hàm tạo, phù hợp với các thuộc tính chỉ đọc và không thể vô hiệu hóa của Kotlin
Mã này tận dụng các tiện ích mở rộng của Kotlin
01 vàimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id["org.springframework.boot"] version "3.0.1" id["io.spring.dependency-management"] version "1.1.0" kotlin["jvm"] version "1.8.0" kotlin["plugin.spring"] version "1.8.0" kotlin["plugin.jpa"] version "1.8.0" }
02 [bạn cần nhập chúng]import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id["org.springframework.boot"] version "3.0.1" id["io.spring.dependency-management"] version "1.1.0" kotlin["jvm"] version "1.8.0" kotlin["plugin.spring"] version "1.8.0" kotlin["plugin.jpa"] version "1.8.0" }
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
03import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
3Vòng đời của phiên bản thử nghiệm
Đôi khi bạn cần thực thi một phương thức trước hoặc sau tất cả các bài kiểm tra của một lớp nhất định. Giống như Junit 4, JUnit 5 theo mặc định yêu cầu các phương thức này là tĩnh [có nghĩa là trong Kotlin, khá dài dòng và không đơn giản] vì các lớp kiểm tra được khởi tạo một lần cho mỗi lần kiểm tra
Nhưng Junit 5 cho phép bạn thay đổi hành vi mặc định này và khởi tạo các lớp kiểm tra một lần cho mỗi lớp. Điều này có thể được thực hiện trong , ở đây chúng tôi sẽ sử dụng tệp thuộc tính để thay đổi hành vi mặc định cho toàn bộ dự án
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
05import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
4Với cấu hình này, giờ đây chúng ta có thể sử dụng các chú thích
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"
}
}
9 và import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
00 trên các phương thức thông thường như được hiển thị trong phiên bản cập nhật của import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
08 ở trênimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
03import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
5Tạo tiện ích mở rộng của riêng bạn
Thay vì sử dụng các lớp util với các phương thức trừu tượng như trong Java, Kotlin thường cung cấp các chức năng như vậy thông qua các tiện ích mở rộng của Kotlin. Ở đây chúng ta sẽ thêm một hàm
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
10 vào loại import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
11 hiện có để tạo văn bản với định dạng ngày tháng tiếng Anhimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
12import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
6Chúng tôi sẽ tận dụng các tiện ích mở rộng này trong phần tiếp theo
Kiên trì với JPA
Để làm cho quá trình tìm nạp chậm hoạt động như mong đợi, các thực thể phải là ____3_______5 như được mô tả trong KT-28525. Chúng ta sẽ sử dụng plugin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
14 của Kotlin cho mục đích đóvới lớp
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
7Hoặc với Maven
package com.example.blog
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class BlogApplication
fun main[args: Array] {
runApplication[*args]
}
0import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
8Sau đó, chúng tôi tạo mô hình của mình bằng cách sử dụng Kotlin, cho phép khai báo đồng thời các thuộc tính và tham số hàm tạo
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
17import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
9Lưu ý rằng chúng tôi đang sử dụng tiện ích mở rộng
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
18 ở đây để cung cấp đối số mặc định cho tham số import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
19 của hàm tạo import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
20. Các tham số tùy chọn có giá trị mặc định được xác định ở vị trí cuối cùng để có thể bỏ qua chúng khi sử dụng đối số vị trí [Kotlin cũng hỗ trợ ]. Lưu ý rằng trong Kotlin, không có gì lạ khi nhóm các khai báo lớp ngắn gọn trong cùng một tệpỞ đây chúng tôi không sử dụng các lớp
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
21 với các thuộc tính 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"
}
}
8 vì JPA không được thiết kế để hoạt động với các lớp bất biến hoặc các phương thức được tạo tự động bởi lớp import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
21. Nếu bạn đang sử dụng hương vị Spring Data khác, hầu hết chúng được thiết kế để hỗ trợ các cấu trúc như vậy, vì vậy bạn nên sử dụng các lớp như import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
24 khi sử dụng Spring Data MongoDB, Spring Data JDBC, v.v.Mặc dù Spring Data JPA cho phép sử dụng ID tự nhiên [có thể là thuộc tính
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
25 trong lớp import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
26] thông qua , nhưng nó không phù hợp với Kotlin do KT-6653, đó là lý do tại sao bạn nên luôn sử dụng các thực thể được tạo Chúng tôi cũng khai báo kho lưu trữ Spring Data JPA của chúng tôi như sau
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
28tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
0Và chúng tôi viết các bài kiểm tra JPA để kiểm tra xem các trường hợp sử dụng cơ bản có hoạt động như mong đợi hay không
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
29tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
1Ở đây, chúng tôi sử dụng tiện ích mở rộng
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
30 của Kotlin được cung cấp theo mặc định với Dữ liệu mùa xuân, đây là một biến thể không thể vô hiệu hóa của
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
jpa
spring
-Xjsr305=strict
org.jetbrains.kotlin
kotlin-maven-noarg
${kotlin.version}
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
2 dựa trên import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
32. Đọc Null tuyệt vời là bạn của bạn, không phải là một bài đăng trên blog sai lầm để biết thêm chi tiếtTriển khai công cụ blog
Chúng tôi cập nhật các mẫu Mustache "blog"
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"
}
}
4tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
2Và chúng tôi tạo một "bài viết" mới
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
34tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
3Chúng tôi cập nhật
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
35 để hiển thị các trang blog và bài báo với ngày được định dạng. Các tham số hàm tạo của import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
36 và import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
37 sẽ được tự động nối dây vì import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
35 có một hàm tạo duy nhất [ẩn _______14_______39]fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
8tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
4Sau đó, chúng tôi thêm phần khởi tạo dữ liệu vào một lớp
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
41 mớiimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
42tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
5Lưu ý việc sử dụng các tham số được đặt tên để làm cho mã dễ đọc hơn
Và chúng tôi cũng cập nhật các bài kiểm tra tích hợp cho phù hợp
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
03tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
6Bắt đầu [hoặc khởi động lại] ứng dụng web và đi đến
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"
}
}
7, bạn sẽ thấy danh sách các bài viết có liên kết có thể nhấp để xem một bài viết cụ thểHiển thị API HTTP
Bây giờ chúng tôi sẽ triển khai API HTTP thông qua bộ điều khiển chú thích
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
45import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
46tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
7Đối với các bài kiểm tra, thay vì kiểm tra tích hợp, chúng tôi sẽ tận dụng
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
47 và Mockk tương tự như Mockito nhưng phù hợp hơn với KotlinVì các chú thích
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
48 và import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
49 dành riêng cho Mockito, nên chúng tôi sẽ tận dụng SpringMockK cung cấp các chú thích tương tự import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
50 và import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
51 cho Mockkvới lớp
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
8Hoặc với Maven
package com.example.blog
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class BlogApplication
fun main[args: Array] {
runApplication[*args]
}
0tasks.withType {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
}
}
9import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
54dependencies {
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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
0import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
55 cần được thoát trong chuỗi vì nó được sử dụng để nội suy chuỗiThuộc tính Cấu hình
Trong Kotlin, cách được đề xuất để quản lý thuộc tính ứng dụng của bạn là sử dụng thuộc tính chỉ đọc
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
56dependencies {
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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
1Sau đó, chúng tôi kích hoạt nó ở cấp độ
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
57fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
2dependencies {
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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
2Để tạo để IDE của bạn nhận ra các thuộc tính tùy chỉnh này, kapt phải được định cấu hình với phụ thuộc
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
59 như sauspring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9dependencies {
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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
3Lưu ý rằng một số tính năng [chẳng hạn như phát hiện giá trị mặc định hoặc các mục không dùng nữa] không hoạt động do những hạn chế trong mô hình mà kapt cung cấp. Ngoài ra, việc xử lý chú thích chưa được hỗ trợ với Maven do KT-18022, xem phần khởi tạo #438 để biết thêm chi tiết
Trong IntelliJ IDEA
Đảm bảo plugin Spring Boot được bật trong menu Tệp. Cài đặt. bổ sung. khởi động mùa xuân
Cho phép xử lý chú thích qua menu File. Cài đặt. Xây dựng, Thực thi, Triển khai. Trình biên dịch. Bộ xử lý chú thích. Bật xử lý chú thích
Vì Kapt chưa được tích hợp trong IDEA nên bạn cần chạy thủ công lệnh
61 để tạo siêu dữ liệuimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id["org.springframework.boot"] version "3.0.1" id["io.spring.dependency-management"] version "1.1.0" kotlin["jvm"] version "1.8.0" kotlin["plugin.spring"] version "1.8.0" kotlin["plugin.jpa"] version "1.8.0" }
Giờ đây, các thuộc tính tùy chỉnh của bạn sẽ được nhận dạng khi chỉnh sửa
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id["org.springframework.boot"] version "3.0.1"
id["io.spring.dependency-management"] version "1.1.0"
kotlin["jvm"] version "1.8.0"
kotlin["plugin.spring"] version "1.8.0"
kotlin["plugin.jpa"] version "1.8.0"
}
62 [tự động hoàn thành, xác thực, v.v. ]
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-mustache
org.springframework.boot
spring-boot-starter-web
com.fasterxml.jackson.module
jackson-module-kotlin
org.jetbrains.kotlin
kotlin-reflect
org.jetbrains.kotlin
kotlin-stdlib
org.springframework.boot
spring-boot-devtools
runtime
com.h2database
h2
runtime
org.springframework.boot
spring-boot-starter-test
test
2dependencies {
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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
4Chỉnh sửa mẫu và bộ điều khiển cho phù hợp
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"
}
}
4dependencies {
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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
5fun main[args: Array] {
runApplication[*args] {
setBannerMode[Banner.Mode.OFF]
}
}
8dependencies {
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"]
runtimeOnly["com.h2database:h2"]
runtimeOnly["org.springframework.boot:spring-boot-devtools"]
testImplementation["org.springframework.boot:spring-boot-starter-test"]
}
6Khởi động lại ứng dụng web, làm mới
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"
}
}
7, bạn sẽ thấy biểu ngữ trên trang chủ blogPhần kết luận
Bây giờ chúng ta đã hoàn thành việc xây dựng ứng dụng blog Kotlin mẫu này. Mã nguồn có sẵn trên Github. Bạn cũng có thể xem tài liệu tham khảo Spring Boot nếu bạn cần thêm chi tiết về các tính năng cụ thể