1. Kotlin的優(yōu)勢(shì)
- Kotlin是一種靜態(tài)類(lèi)型的語(yǔ)言犁柜,但由于其巧妙的類(lèi)型推斷,它允許你編寫(xiě)的代碼與動(dòng)態(tài)語(yǔ)言一樣簡(jiǎn)短而富有表現(xiàn)力堂淡,表現(xiàn)接近于純Java項(xiàng)目
- 屬性(properties)支持
- 與其他語(yǔ)言相比擁有相對(duì)輕巧的標(biāo)準(zhǔn)庫(kù)
- 易于學(xué)習(xí):Java開(kāi)發(fā)人員可以快速了解大部分語(yǔ)言
- 可與Java互操作
- 適合Android開(kāi)發(fā)(已成為谷歌安卓官方指定開(kāi)發(fā)語(yǔ)言)
- 內(nèi)置的不可變性和空指針安全的支持
- 代碼易于閱讀馋缅,高效編寫(xiě)
- 允許擴(kuò)展現(xiàn)有庫(kù)扒腕,而不必繼承類(lèi)或使用任何類(lèi)型的設(shè)計(jì)模式,如Decorator
- 句尾不需要分號(hào);
在 Kotlin disget 2015 的博客里可以找到大量有用的信息幫助你認(rèn)識(shí)Kotlin萤悴,也可以在 kotlin在線(xiàn) 練習(xí)Kotlin語(yǔ)言瘾腰。
2. 初窺 Spring Boot + Kotlin 項(xiàng)目
Kotlin允許使用非常簡(jiǎn)短的定義方式(data class)聲明實(shí)體類(lèi),參數(shù)允許指定默認(rèn)值覆履,參數(shù)類(lèi)型在參數(shù)之后給出:
@Entity
data class Customer(
var firstName: String = "",
var lastName: String = "",
@Id @GeneratedValue(strategy = GenerationType.AUTO)
var id: Long = 0
)
請(qǐng)注意跟在data class
之后的是一個(gè)圓括號(hào)蹋盆,而不是常見(jiàn)類(lèi)的花括號(hào)。
@RestController
class CustomerController (val repository:CustomerRepository) {
@GetMapping("/")
fun findAll() = repository.findAll()
@GetMapping("/{name}")
fun findByLastName(@PathVariable name:String)
= repository.findByLastName(name)
}
- 上面可以看到一個(gè)
Spring MVC REST controller
采用了構(gòu)造函數(shù)級(jí)別的注入方式硝全,而且 Kotlin 默認(rèn)類(lèi)可見(jiàn)性為public(java為default)栖雾,所以不必特別指定。 - 如果函數(shù)返回一個(gè)單句表達(dá)式柳沙,允許不寫(xiě)花括號(hào)岩灭,直接讓函數(shù)
=
該表達(dá)式,那么返回類(lèi)型將由Kotlin自動(dòng)推斷赂鲤。
interface CustomerRepository : CrudRepository<Customer, Long> {
fun findByLastName(name: String): List<Customer>
}
定義一個(gè) Spring Data repository
也非常簡(jiǎn)單噪径。
@SpringBootApplication
open class Application {
@Bean
open fun init(repository: CustomerRepository) = CommandLineRunner {
repository.save(Customer("Jack", "Bauer"))
repository.save(Customer("Chloe", "O'Brian"))
repository.save(Customer("Kim", "Bauer"))
repository.save(Customer("David", "Palmer"))
repository.save(Customer("Michelle", "Dessler"))
}
}
fun main(args: Array<String>) {
SpringApplication.run(Application::class.java, *args)
}
- 在Java中,函數(shù)必須寄身于類(lèi)数初,而Kotlin可以支持頂級(jí)函數(shù)找爱。所以可以像上面的方式聲明我們的
Spring Boot
入口類(lèi)。 - 在Kotlin中類(lèi)和方法都默認(rèn)為final泡孩,不允許被繼承/覆寫(xiě)车摄。如果需要,請(qǐng)?zhí)砑觨pen修飾符仑鸥。
3. 額外說(shuō)明
-
數(shù)組注解屬性無(wú)法像Java一樣
// java @RequestMapping(method = RequestMethod.GET) // kotlin @RequestMapping(method = arrayOf(RequestMethod.GET))
不過(guò)kotlin1.1有對(duì)它進(jìn)行了改善吮播,可以查看這個(gè)issue。
-
屬性注入問(wèn)題
var name = "cmx"; var hello = "My name is ${name}"; @Value("\${some.property}")
在kotlin中眼俊,
$
被用于字符串插值意狠,所以@Value
屬性注入時(shí),其中$
前應(yīng)當(dāng)添加 反斜線(xiàn) 進(jìn)行轉(zhuǎn)義或采用@ConfigurationProperties
替代疮胖。 -
使用Jackson的問(wèn)題
如果你使用的是Jackson环戈,你可能需要添加
com.fasterxml.jackson.module:jackson-module-kotlin
的依賴(lài)關(guān)系,以允許它處理沒(méi)有默認(rèn)構(gòu)造函數(shù)或Kotlin集合的數(shù)據(jù)類(lèi)澎灸。在Spring Framework 4.3+
中已經(jīng)自動(dòng)注冊(cè)院塞。
4. demo起步
IntelliJ IDEA 目前可以直接創(chuàng)建采用Kotlin語(yǔ)言的spring boot項(xiàng)目,選擇language為kotlin即可性昭。
附github:mongo + kotlin小案例