關(guān)于Spring Boot和Kotlin的聯(lián)合開發(fā)
一、概述
spring官方最近宣布,將在Spring Framework 5.0版本中正式支持Kotlin語言。這意味著Spring Boot 2.x版本將為Kotlin提供一流的支持。
這并不會令人意外,因為Pivotal團(tuán)隊以廣泛接納JVM語言(如Scala和Groovy)而聞名。下面我們用Spring Boot 2.x和Kotlin應(yīng)用程序。
二、搭建環(huán)境
1、環(huán)境
IntelliJ和Eclipse都對Kotlin提供了支持,可以根據(jù)自己的喜好搭建Kotlin開發(fā)環(huán)境。
2、構(gòu)建應(yīng)用
首先創(chuàng)建一個Spring Boot 2項目,然后修改POM配置,讓項目保護(hù)指定的Java版本和Kotlin版本。依賴關(guān)系如下:
<dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib-jre8</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-reflect</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> <version>1.1.2</version> </dependency>
注意,我們正在為Kotlin源碼文件和測試文件指定文件位置:
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
要編譯Kotlin模塊和源碼,需要使用kotlin-maven-plugin插件:
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>1.1.2</version>
<configuration>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
<jvmTarget>1.8</jvmTarget>
</configuration>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
</plugin>
到此為止,構(gòu)建Kotlin應(yīng)用程序所需的一切就搭建好了。注意,可以去Maven中央倉庫尋找以下組件的最新版本:spring-boot-starter-web、kotlin-stdlib-jre8、kotlin-reflect、jackson-module-kotlin、spring-boot-starter-test。
下面設(shè)置應(yīng)用程序的上下文。
3、應(yīng)用程序上下文
下面進(jìn)入Kotlin的代碼,編寫熟悉的Spring Boot應(yīng)用程序上下文:
@SpringBootApplication
class KotlinDemoApplication
fun main(args: Array<String>) {
SpringApplication.run(KotlinDemoApplication::class.java, *args)
}
可以看到熟悉的@SpringBootApplication注解。
我們有一個類定義了KotlinDemoApplication類。在Kotlin中,類的默認(rèn)范圍是public,所以可以省略。另外,如果一個類沒有變量、沒有函數(shù),它可以被聲明為沒有大括號。所以,從本質(zhì)上講,我們只是定義了一個類。
另外,方法或函數(shù)默認(rèn)是公開的,所以不必在這里聲明。另外,不返回任何內(nèi)容的函數(shù)不需要指定一個void返回類型。
最后,在一個類的外部定義的任何函數(shù)都是自動靜態(tài)的。這使得這些函數(shù)可以在啟動時得到執(zhí)行。
現(xiàn)在讓我們從根目錄運(yùn)行我們的應(yīng)用程序,使用mvn spring-boot: run。應(yīng)用程序得以啟動,應(yīng)該可以看到應(yīng)用程序在端口8080上運(yùn)行。
接下來,構(gòu)建一個控制器。
4、控制器
現(xiàn)在添加一個控制器到服務(wù)中:
@RestController
class HelloController {
@GetMapping("/hello")
fun helloKotlin(): String {
return "hello world"
}
}
與標(biāo)準(zhǔn)的Spring控制器沒有太大的不同,但是肯定代碼量更精簡。我們?yōu)榇丝刂破魈砑右粋€測試類和案例來驗證我們的工作:
@RunWith(SpringRunner::class)
@SpringBootTest(classes = arrayOf(KotlinDemoApplication::class),
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class KotlinDemoApplicationTests {
@Autowired
lateinit var testRestTemplate: TestRestTemplate
@Test
fun whenCalled_shouldReturnHello() {
val result = testRestTemplate
// ...
.getForEntity("/hello", String::class.java)
assertNotNull(result)
assertEquals(result?.statusCode, HttpStatus.OK)
assertEquals(result?.body, "hello world")
}
}
這個測試顯示了Kotlin強(qiáng)大的功能之一——null安全!可以為null的Kotlin變量必須使用“?”聲明。然后,編譯器知道在訪問該屬性之前需要進(jìn)行防御性編碼。
在我們的測試中,TestRestTemplate被定義為可空類型,每次訪問它時,我們使用null合并運(yùn)算符“?”來實現(xiàn)——如果被調(diào)用對象為空,則返回null。
這聲明了在程序中使用null,并強(qiáng)制開發(fā)人員在使用它們時編寫安全的代碼。
接下來,我們添加一個服務(wù)并將其集成到我們的控制器中。
5、服務(wù)
服務(wù)很容易添加到我們的項目中。這樣做:
@Service
class HelloService {
fun getHello(): String {
return "hello service"
}
}
這里的簡單服務(wù)與單個函數(shù)返回一個String。接下來,讓我們將服務(wù)連接到控制器中并使用它來返回值:
@RestController
class HelloController(val helloService: HelloService) {
// ...
@GetMapping("/hello-service")
fun helloKotlinService(): String {
return helloService.getHello()
}
}
啊,看起來不錯!在Kotlin中,主構(gòu)造函數(shù)可以與類聲明一起定義。我們從構(gòu)造函數(shù)中省略了@Autowired注釋,因為它不是一段時間的強(qiáng)制性的。
這些參數(shù)將自動轉(zhuǎn)換為類中的字段。Kotlin稱它們?yōu)閷傩?。無需定義getter或setter方法,因為它們是自動創(chuàng)建的。當(dāng)然,如果需要,您可以覆蓋這些默認(rèn)值。
在Kotlin中,函數(shù)中的類和變量的屬性可以使用var或val來定義。var表示可變屬性,val表示final屬性。這允許編譯器檢查非法訪問。由于HelloService是一個單例,所以我們把它連接成一個val來防止突變。
接下來,我們?yōu)榇丝刂破鞣椒ㄌ砑右粋€測試:
@Test
fun whenCalled_shouldReturnHelloService() {
var result = testRestTemplate
// ...
.getForEntity("/hello-service", String::class.java)
assertNotNull(result)
assertEquals(result?.statusCode, HttpStatus.OK)
assertEquals(result?.body, "hello service")
}
最后,我們來看看一個POJO在Kotlin中的樣子。
6、Kotlin的數(shù)據(jù)類
在Java中,我們使用POJO來表示數(shù)據(jù)對象。在Kotlin中,可以更簡潔地表達(dá)這種類型的對象——一個數(shù)據(jù)類。
我們寫一個數(shù)據(jù)對象返回到控制器中:
data class HelloDto(val greeting: String)
這里沒有什么竅門,自動省略。使用data修飾符,可以獲得很多好處。此關(guān)鍵字會自動創(chuàng)建一個equals()方法和hashcode()方法,以及toString()方法和copy()方法。所有這些方法一個修飾符就搞定了。
現(xiàn)在我們來添加一個返回新數(shù)據(jù)類的方法:
// ...
@GetMapping("/hello-dto")
fun helloDto(): HelloDto {
return HelloDto("Hello from the dto")
}
數(shù)據(jù)修飾符不添加默認(rèn)構(gòu)造函數(shù),這對于像Jackson這樣的庫很重要。為了支持這種類型的類,我們將jackson-module-kotlin添加到我們的POM文件中以支持編組。
最后,我們添加一個這個控制器功能的測試:
@Test
fun whenCalled_shoudlReturnJSON() {
val result = testRestTemplate
// ...
.getForEntity("/hello-dto", HelloDto::class.java)
assertNotNull(result)
assertEquals(result?.statusCode, HttpStatus.OK)
assertEquals(result?.body, HelloDto("Hello from the dto"))
}
三、結(jié)論
在本文中,結(jié)合Spring Boot 2.x和Kotlin語言,我們完成了一個Demo應(yīng)用。從示例中可以看到,Kotlin可以通過強(qiáng)制來精簡代碼,保證更安全的代碼來簡化和增強(qiáng)我們的應(yīng)用程序。
Kotlin還支持一些驚人的功能,如數(shù)據(jù)類、類擴(kuò)展,并與現(xiàn)有的Java代碼完全兼容。這意味著開發(fā)者可以編寫Kotlin代碼,并從Java類中調(diào)用它,反之亦然。此外,Kotlin是從一開始就建立起來的,在IDE中能得到非常好的支持。
Google和Spring都開始支持Kotlin語言,或許使用Kotlin的時候到了。
以上所述是小編給大家介紹的關(guān)于Spring Boot和Kotlin的聯(lián)合開發(fā),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- spring boot + jpa + kotlin入門實例詳解
- 使用Spring boot + jQuery上傳文件(kotlin)功能實例詳解
- Spring Boot 與 Kotlin 使用JdbcTemplate連接MySQL數(shù)據(jù)庫的方法
- Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法
- Kotlin + Spring Boot 請求參數(shù)驗證的代碼實例
- 詳解用Kotlin寫一個基于Spring Boot的RESTful服務(wù)
- Spring Boot 與 Kotlin 使用Redis數(shù)據(jù)庫的配置方法
- Spring Boot 與 Kotlin 上傳文件的示例代碼
- Spring Boot與Kotlin定時任務(wù)的示例(Scheduling Tasks)
- 利用Kotlin + Spring Boot實現(xiàn)后端開發(fā)
相關(guān)文章
IDEA的部署設(shè)置改為war exploded運(yùn)行項目出錯問題
在使用IDEA配置warexploded部署時,可能會遇到路徑問題或404錯誤,解決方法是進(jìn)入Deployment設(shè)置,刪除Application content中的/marry_war_exploded,使其為空,然后重新運(yùn)行項目即可,這是一種有效的解決策略,希望能幫助到遇到同樣問題的開發(fā)者2024-10-10
Scala數(shù)據(jù)庫連接池的簡單實現(xiàn)
本文主要介紹了Scala數(shù)據(jù)庫連接池的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Java結(jié)合redistemplate使用分布式鎖案例講解
在Java中使用RedisTemplate結(jié)合Redis來實現(xiàn)分布式鎖是一種常見的做法,特別適用于微服務(wù)架構(gòu)或多實例部署的應(yīng)用程序中,以確保數(shù)據(jù)的一致性和避免競態(tài)條件,下面給大家分享使用Spring Boot和RedisTemplate實現(xiàn)分布式鎖的案例,感興趣的朋友一起看看吧2024-08-08
SpringBoot實現(xiàn)郵件發(fā)送功能的姿勢分享
我們在日常開發(fā)中,經(jīng)常會碰到email郵件發(fā)送的場景,如發(fā)送驗證碼,向客戶發(fā)送郵件等等,這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)郵件發(fā)送的相關(guān)資料,需要的朋友可以參考下2021-08-08

