一、概述
spring官方最近宣布,將在Spring Framework 5.0版本中正式支持Kotlin語言。這意味著Spring Boot 2.x版本將為Kotlin提供一流的支持。
這並不會令人意外,因為Pivotal團隊以廣泛接納JVM語言(如Scala和Groovy)而聞名。下面我們用Spring Boot 2.x和Kotlin應用程序。
二、搭建環境
1、環境
IntelliJ和Eclipse都對Kotlin提供了支持,可以根據自己的喜好搭建Kotlin開發環境。
2、構建應用
首先創建一個Spring Boot 2項目,然後修改POM配置,讓項目保護指定的Java版本和Kotlin版本。依賴關系如下:
<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>
到此為止,構建Kotlin應用程序所需的一切就搭建好了。注意,可以去Maven中央倉庫尋找以下組件的最新版本:spring-boot-starter-web、kotlin-stdlib-jre8、kotlin-reflect、jackson-module-kotlin、spring-boot-starter-test。
下面設置應用程序的上下文。
3、應用程序上下文
下面進入Kotlin的代碼,編寫熟悉的Spring Boot應用程序上下文:
@SpringBootApplication class KotlinDemoApplication fun main(args: Array<String>) { SpringApplication.run(KotlinDemoApplication::class.java, *args) }
可以看到熟悉的@SpringBootApplication注解。
我們有一個類定義了KotlinDemoApplication類。在Kotlin中,類的默認范圍是public,所以可以省略。另外,如果一個類沒有變量、沒有函數,它可以被聲明為沒有大括號。所以,從本質上講,我們只是定義了一個類。
另外,方法或函數默認是公開的,所以不必在這裡聲明。另外,不返回任何內容的函數不需要指定一個void返回類型。
最後,在一個類的外部定義的任何函數都是自動靜態的。這使得這些函數可以在啟動時得到執行。
現在讓我們從根目錄運行我們的應用程序,使用mvn spring-boot: run。應用程序得以啟動,應該可以看到應用程序在端口8080上運行。
接下來,構建一個控制器。
4、控制器
現在添加一個控制器到服務中:
@RestController class HelloController { @GetMapping("/hello") fun helloKotlin(): String { return "hello world" } }
與標准的Spring控制器沒有太大的不同,但是肯定代碼量更精簡。我們為此控制器添加一個測試類和案例來驗證我們的工作:
@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強大的功能之一——null安全!可以為null的Kotlin變量必須使用“?”聲明。然後,編譯器知道在訪問該屬性之前需要進行防御性編碼。
在我們的測試中,TestRestTemplate被定義為可空類型,每次訪問它時,我們使用null合並運算符“?”來實現——如果被調用對象為空,則返回null。
這聲明了在程序中使用null,並強制開發人員在使用它們時編寫安全的代碼。
接下來,我們添加一個服務並將其集成到我們的控制器中。
5、服務
服務很容易添加到我們的項目中。這樣做:
@Service class HelloService { fun getHello(): String { return "hello service" } }
這裡的簡單服務與單個函數返回一個String。接下來,讓我們將服務連接到控制器中並使用它來返回值:
@RestController class HelloController(val helloService: HelloService) { // ... @GetMapping("/hello-service") fun helloKotlinService(): String { return helloService.getHello() } }
啊,看起來不錯!在Kotlin中,主構造函數可以與類聲明一起定義。我們從構造函數中省略了@Autowired注釋,因為它不是一段時間的強制性的。
這些參數將自動轉換為類中的字段。Kotlin稱它們為屬性。無需定義getter或setter方法,因為它們是自動創建的。當然,如果需要,您可以覆蓋這些默認值。
在Kotlin中,函數中的類和變量的屬性可以使用var或val來定義。var表示可變屬性,val表示final屬性。這允許編譯器檢查非法訪問。由於HelloService是一個單例,所以我們把它連接成一個val來防止突變。
接下來,我們為此控制器方法添加一個測試:
@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的數據類
在Java中,我們使用POJO來表示數據對象。在Kotlin中,可以更簡潔地表達這種類型的對象——一個數據類。
我們寫一個數據對象返回到控制器中:
data class HelloDto(val greeting: String)
這裡沒有什麼竅門,自動省略。使用data修飾符,可以獲得很多好處。此關鍵字會自動創建一個equals()方法和hashcode()方法,以及toString()方法和copy()方法。所有這些方法一個修飾符就搞定了。
現在我們來添加一個返回新數據類的方法:
// ... @GetMapping("/hello-dto") fun helloDto(): HelloDto { return HelloDto("Hello from the dto") }
數據修飾符不添加默認構造函數,這對於像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")) }
三、結論
在本文中,結合Spring Boot 2.x和Kotlin語言,我們完成了一個Demo應用。從示例中可以看到,Kotlin可以通過強制來精簡代碼,保證更安全的代碼來簡化和增強我們的應用程序。
Kotlin還支持一些驚人的功能,如數據類、類擴展,並與現有的Java代碼完全兼容。這意味著開發者可以編寫Kotlin代碼,並從Java類中調用它,反之亦然。此外,Kotlin是從一開始就建立起來的,在IDE中能得到非常好的支持。
Google和Spring都開始支持Kotlin語言,或許使用Kotlin的時候到了。
以上所述是小編給大家介紹的關於Spring Boot和Kotlin的聯合開發,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對網站的支持!