使用Kotlin開(kāi)發(fā)spring boot應(yīng)用

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)
}
  1. 上面可以看到一個(gè) Spring MVC REST controller 采用了構(gòu)造函數(shù)級(jí)別的注入方式硝全,而且 Kotlin 默認(rèn)類(lèi)可見(jiàn)性為public(java為default)栖雾,所以不必特別指定。
  2. 如果函數(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)
}
  1. 在Java中,函數(shù)必須寄身于類(lèi)数初,而Kotlin可以支持頂級(jí)函數(shù)找爱。所以可以像上面的方式聲明我們的 Spring Boot 入口類(lèi)。
  2. 在Kotlin中類(lèi)和方法都默認(rèn)為final泡孩,不允許被繼承/覆寫(xiě)车摄。如果需要,請(qǐng)?zhí)砑觨pen修飾符仑鸥。

3. 額外說(shuō)明

  1. 數(shù)組注解屬性無(wú)法像Java一樣

    // java
    @RequestMapping(method = RequestMethod.GET)
    
    // kotlin
    @RequestMapping(method = arrayOf(RequestMethod.GET))
    

    不過(guò)kotlin1.1有對(duì)它進(jìn)行了改善吮播,可以查看這個(gè)issue

  2. 屬性注入問(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 替代疮胖。

  3. 使用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小案例

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拦止,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子糜颠,更是在濱河造成了極大的恐慌创泄,老刑警劉巖艺玲,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括蝠,死亡現(xiàn)場(chǎng)離奇詭異鞠抑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)忌警,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)搁拙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人法绵,你說(shuō)我怎么就攤上這事箕速。” “怎么了朋譬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盐茎,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我徙赢,道長(zhǎng)字柠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任狡赐,我火速辦了婚禮窑业,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枕屉。我一直安慰自己常柄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布搀擂。 她就那樣靜靜地躺著西潘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哨颂。 梳的紋絲不亂的頭發(fā)上喷市,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音咆蒿,去河邊找鬼东抹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沃测,可吹牛的內(nèi)容都是我干的缭黔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蒂破,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼馏谨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起附迷,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惧互,失蹤者是張志新(化名)和其女友劉穎哎媚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體喊儡,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拨与,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艾猜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片买喧。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匆赃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情算柳,我是刑警寧澤低淡,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瞬项,受9級(jí)特大地震影響蔗蹋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滥壕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一纸颜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绎橘,春花似錦胁孙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冈止,卻和暖如春狂票,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熙暴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工闺属, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人周霉。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓掂器,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親俱箱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子国瓮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容