成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Kotlin + Spring Boot服務(wù)端開發(fā)

e10101 / 3116人閱讀

摘要:是什么著名廠商開發(fā)的基于的靜態(tài)類型編程語(yǔ)言,聲稱。語(yǔ)法近似和,且已活躍在開發(fā)領(lǐng)域,被譽(yù)為平臺(tái)的。各有千秋,我更認(rèn)同改寫字節(jié)碼。的作用是防止敏感字段被泄露到中,的作用是軟刪除數(shù)據(jù)不可見,但沒有真的刪除。

Kotlin是什么?

著名IDE廠商JetBrains開發(fā)的基于JVM的靜態(tài)類型編程語(yǔ)言,聲稱100%?interoperable?with?Java。Kotlin是由工程師設(shè)計(jì)的,各種細(xì)節(jié)設(shè)計(jì)非常切合工程師的需要。語(yǔ)法近似Java和Scala,且已活躍在Android開發(fā)領(lǐng)域,被譽(yù)為Android平臺(tái)的Swift。

Kotlin能與Java混合使用,并且直接復(fù)用Java的生態(tài)系統(tǒng)(庫(kù)、框架、工具)。一個(gè)已有的Java項(xiàng)目,只需引用Kotlin的Maven/Gradle插件,以及引用Kotlin標(biāo)準(zhǔn)庫(kù)的依賴,就可以逐漸摻入Kotlin代碼。你完全可以當(dāng)它是a better Java。

Kotlin的學(xué)習(xí)曲線極其平緩,學(xué)習(xí)量相當(dāng)于一個(gè)框架。有經(jīng)驗(yàn)的程序員閱讀了文檔就能立刻用起來(lái)了。不信你看:

原版文檔 http://kotlinlang.org/docs/re...

中文文檔 http://kotlindoc.com

舉幾個(gè)例子來(lái)說(shuō)明Kotlin的優(yōu)點(diǎn)吧,上代碼:

//句尾不用寫分號(hào)

// 自動(dòng)推導(dǎo)變量類型,無(wú)需聲明
val a = "Hello"

// 簡(jiǎn)單的println
println(a.length() == 5)

// 不用寫new, 直接調(diào)構(gòu)造函數(shù)
val b = String("Hello")

// 字符串插值
"$a $b" == "Hello Hello"

// if-else是表達(dá)式, 真方便!
// ==相當(dāng)于equals, 再也不怕忘寫equals了!
val oneOrTwo = if (a == "Hello") 1 else 2

// ===相當(dāng)于Java的==
(a === b) == false

// Lambda用{}包起來(lái),若有唯一參數(shù),參數(shù)名默認(rèn)為it
// 集合的函數(shù)式操作, 無(wú)需Java 8繁瑣的stream.collect(Collectors.toList())
listOf(-1, 0, 1).map{it + 1}.filter{it > 0} == listOf(1, 2)

// ?. (null-safe調(diào)用)
// ?: (用默認(rèn)值給null兜底)
val numStr = getNumberOrNull()?.toString() ?: ""

// 自動(dòng)關(guān)閉的資源
FileInputStream("MyFile").use { stream -> // 可指定參數(shù)名為stream, 取代默認(rèn)的it
  val firstByte = stream.read()
}

// 可以更簡(jiǎn)單,一行
val fileContent = File("MyFile").readText()

// lazy, 延遲初始化
class CPU {
  val cpuCores by lazy { Runtime.getRuntime().availableProcessors() }
}

Kotlin為厭煩Java而疑慮Scala的人提供了避風(fēng)港,為喜歡Groovy而想要靜態(tài)類型的人提供了避風(fēng)港。啊!生活。

Spring Boot是什么?

Spring Boot是流行的Web快速開發(fā)框架,使基于Spring的開發(fā)更便捷。
我們已經(jīng)知道Spring很好用,而Spring Boot的設(shè)計(jì)目標(biāo)是:

為一切Spring開發(fā)提供極速、通用的上手體驗(yàn)

開箱即用,但是當(dāng)默認(rèn)值不適合需求時(shí)不會(huì)妨礙你做改變

提供一組適用于各種項(xiàng)目類型的非功能性特性(如內(nèi)嵌服務(wù)器、安全、度量、健康檢查、外部配置)

完全不需要代碼生成和XML配置

Kotlin + Spring Boot

Kotlin能輕松集成Spring Boot,用Java怎么寫,用Kotlin基本上也怎么寫。

Spring能在線生成項(xiàng)目,免去創(chuàng)建項(xiàng)目的煩惱,請(qǐng)猛擊鏈接http://start.spring.io/ 。

我們用Gradle構(gòu)建,寫一個(gè)build.gradle文件:
buildscript {
  ext {
    springBootVersion = "1.3.5.RELEASE"
    kotlinVersion = "1.0.4"
  }
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
  }
}

apply plugin: "kotlin"
apply plugin: "spring-boot"

jar {
  baseName = "myapp"
  version = "0.1-SNAPSHOT"
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
// class文件保留參數(shù)名稱
compileJava.options.compilerArgs.add "-parameters"
compileTestJava.options.compilerArgs.add "-parameters"
springBoot {
  mainClass = "myapp.ApplicationKt"
}

dependencies {
  compile "org.springframework.boot:spring-boot-starter-aop"
  compile "org.springframework.boot:spring-boot-starter-web"
  compile "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}"
}
先寫一個(gè)主類Application.kt,放在src/main/kotlin目錄下(自己想一個(gè)包名哈),來(lái)啟動(dòng)整個(gè)應(yīng)用:
@SpringBootApplication
open class Application {

  @Bean
  open fun json(): MappingJackson2JsonView {
    return MappingJackson2JsonView(ObjectMapper())
  }
}

fun main(args: Array) {
  SpringApplication.run(Application::class.java, *args)
}

Kotlin的函數(shù)可定義在類外面,而特殊的main函數(shù)要么放在外面,要么放在伴生對(duì)象(companion object)里面。這里就放在外面吧!

你會(huì)發(fā)現(xiàn)class和fun前面有open修飾符,它的意思是非final,Kotlin默認(rèn)一切都是final的,如果不想要final救要加上open。由于Spring有時(shí)要?jiǎng)?chuàng)建代理,要求類和方法不能為final,因此我們每一處都寫上open,以免忘記。

這里只有一個(gè)json()方法,用來(lái)在Spring中初始化Jackson,這樣我們就能使用JSON了。

現(xiàn)在來(lái)寫一個(gè)RestController,提供RESTful API吧:
@RestController
@RequestMapping("/api/users")
open class UserApi {
    @RequestMapping("/{id}",  method = arrayOf(RequestMethod.GET))
      open fun get(@PathVariable id: Long) = "User(id=$id, name=admin, password=123)"
}

好簡(jiǎn)單??!現(xiàn)在,在IDE中運(yùn)行Application.kt文件,就開始運(yùn)行了!用瀏覽器打開http://localhost:8080/api/users/1

現(xiàn)在要把數(shù)據(jù)保存到數(shù)據(jù)庫(kù)了:

Spring Boot使用JPA非常簡(jiǎn)單(照著官網(wǎng)的getting started學(xué)吧),但我要介紹另一種ORM框架——Ebean,它模仿了Rails的Active Record,支持常用的JPA注解。值得一提的是,Ebean的作者也喜歡Kotlin。

需要一個(gè)配置文件src/main/resources/ebean.properties :

# 是否生成建表SQL
ebean.db.ddl.generate=true
# 是否執(zhí)行建表SQL
ebean.db.ddl.run=false

datasource.db.username=DB用戶名
datasource.db.password=DB密碼
datasource.db.databaseUrl=jdbc:mysql://localhost:3306/你的database名稱
datasource.db.databaseDriver=com.mysql.jdbc.Driver

我們對(duì)ebean.db.ddl.run(是否執(zhí)行建表SQL)選擇了false。因?yàn)镋bean會(huì)生成建表SQL,我們可以手動(dòng)執(zhí)行,避免每次都重新建表,把數(shù)據(jù)丟棄了。編寫實(shí)體類后再運(yùn)行,SQL會(huì)生成在項(xiàng)目目錄下,手動(dòng)執(zhí)行一下吧!(亦可在首次啟動(dòng)前把ebean.db.ddl.run改成true)

然后在Spring中初始化Ebean吧:

// 把這個(gè)方法添加到Application類
  @Bean(autowire = Autowire.BY_TYPE)
  open fun getEbeanServer(): EbeanServer {
    val config = ServerConfig()
    config.name = "db"
    config.loadFromProperties()
    config.isDefaultServer = true
    return EbeanServerFactory.create(config)
  }

然后要修改main方法,在Spring之前先執(zhí)行Ebean的agent,改寫實(shí)體類的字節(jié)碼:

fun main(args: Array) {
  val packageName = "com.iostate.**" // 改成你自己的包名,實(shí)體類要放在這個(gè)包里面
  if (!AgentLoader.loadAgentFromClasspath("avaje-ebeanorm-agent",
                                          "debug=1;packages=$packageName")) {
    System.err.println(
      "avaje-ebeanorm-agent not found in classpath - not dynamically loaded")
  }
  SpringApplication.run(Application::class.java, *args)
}

Ebean需要執(zhí)行agent來(lái)改寫字節(jié)碼(instrumenation),而Hibernate則選擇了給實(shí)體對(duì)象創(chuàng)建動(dòng)態(tài)代理(dynamic proxy),都是為了能對(duì)實(shí)體進(jìn)行AOP操作。

instrumenation使用復(fù)雜,調(diào)試簡(jiǎn)單;dynamic proxy使用簡(jiǎn)單,調(diào)試復(fù)雜。各有千秋,我更認(rèn)同改寫字節(jié)碼。

編寫實(shí)體類:
import javax.persistence.*

import com.avaje.ebean.Model
import com.avaje.ebean.annotation.WhenCreated
import com.avaje.ebean.annotation.WhenModified
import java.sql.Timestamp

import com.avaje.ebean.annotation.SoftDelete
import com.fasterxml.jackson.annotation.JsonIgnore

@MappedSuperclass
abstract class BaseModel : Model() {

  @Id @GeneratedValue
  var id: Long = 0

  @Version
  var version: Long = 0

  @WhenCreated
  var whenCreated: Timestamp? = null

  @WhenModified
  var whenModified: Timestamp? = null

}

@Entity
class User (
    var name: String = "",
    @JsonIgnore
    var password: String = ""
    @SoftDelete
    var deleted: Boolean = false
) : BaseModel() {
  companion object find : Find()
}

第一個(gè)類是所有實(shí)體模型的基類,提供一些通用字段。id是自增主鍵,version是樂觀鎖的標(biāo)志,whenCreated是創(chuàng)建時(shí)間,whenModified是修改時(shí)間。有的變量類型以問(wèn)號(hào)結(jié)尾,這個(gè)跟Swift語(yǔ)言是一樣的,表示可為null(默認(rèn)是非null的)。

第二類是User,行數(shù)很少,沒有繁瑣的getter/setter。@JsonIgnore的作用是防止敏感字段被泄露到JSON中,@SoftDelete的作用是軟刪除(數(shù)據(jù)不可見,但沒有真的刪除)。companion object find : Find()提供了一組快捷查詢方法,如byId(id) all() 。

現(xiàn)在把UserApi修改如下:

@RestController
@RequestMapping("/api/users")
open class UserApi {
  @RequestMapping("/{id}",  method = arrayOf(RequestMethod.GET))
  open fun get(@PathVariable id: Long) = User.byId(id)

  @RequestMapping("/new", method = arrayOf(RequestMethod.POST))
  open fun create(@RequestParam name: String, @RequestParam password: String): User {
    return User(name, password).apply {
      save()
    }
  }
}

get方法真正向數(shù)據(jù)庫(kù)做查詢了!增加了create方法來(lái)創(chuàng)建用戶!如果想用瀏覽器快速測(cè)試,把RequestMethod.POST改成GET,輸入鏈接http://localhost:8080/api/users/new?name=admin&password=123 試試!

一個(gè)注意事項(xiàng)

Spring Boot能把程序打包成jar直接運(yùn)行,這是很方便群眾的!但是JSP和Ebean在jar模式都無(wú)法工作。
那么在生產(chǎn)環(huán)境要怎么解決呢?可以把jar解壓運(yùn)行!
參考文檔的exploded archives: http://docs.spring.io/spring-...

# 解壓
unzip -q myapp.jar
# 運(yùn)行
java org.springframework.boot.loader.JarLauncher
# 生產(chǎn)模式用以下的nohup方式,以防程序隨著shell一起關(guān)閉
nohup java org.springframework.boot.loader.JarLauncher &

我自己用的命令不一樣:

unzip -q myapp.jar
nohup java -cp ".:./lib/*" com.myapp.ApplicationKt &

注意當(dāng)前所在的工作目錄,日志目錄/logs會(huì)創(chuàng)建在當(dāng)前工作目錄下。

收工

我提供了一個(gè)示例項(xiàng)目,比較粗糙,請(qǐng)多多包涵 https://github.com/sorra/bms

老外也有幾個(gè)示例項(xiàng)目,可供參考:

Spring?Boot?Kotlin?project with a REST Webservice and?Spring?Data: https://github.com/sdeleuze/s...

Demo Webapp using SpringBoot, Kotlin and React.js: https://github.com/winterbe/s...

順帶一提,輕境界就是用Kotlin + Spring Boot構(gòu)建的!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/65227.html

相關(guān)文章

  • Kotlin + Spring Boot : 下一代 Java 服務(wù)開發(fā)

    摘要:下一代服務(wù)端開發(fā)下一代服務(wù)端開發(fā)第部門快速開始第章快速開始環(huán)境準(zhǔn)備,,快速上手實(shí)現(xiàn)一個(gè)第章企業(yè)級(jí)服務(wù)開發(fā)從到語(yǔ)言的缺點(diǎn)發(fā)展歷程的缺點(diǎn)為什么是產(chǎn)生的背景解決了哪些問(wèn)題為什么是的發(fā)展歷程容器的配置地獄是什么從到下一代企業(yè)級(jí)服務(wù)開發(fā)在移動(dòng)開發(fā)領(lǐng)域 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開發(fā) 》 Kotlin + Spring Boot : 下一代 Java...

    springDevBird 評(píng)論0 收藏0
  • SpringBoot 2.X Kotlin 系列之Hello World

    摘要:二教程環(huán)境三創(chuàng)建項(xiàng)目創(chuàng)建項(xiàng)目有兩種方式一種是在官網(wǎng)上創(chuàng)建二是在上創(chuàng)建如圖所示勾選然后點(diǎn),然后一直默認(rèn)最后點(diǎn)擊完成即可。我們這里看到和普通的接口沒有異同,除了返回類型是用包裝之外。與之對(duì)應(yīng)的還有,這個(gè)后面我們會(huì)講到。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 從去年開始就開始學(xué)習(xí)...

    warkiz 評(píng)論0 收藏0
  • SpringBootKotlin 完美交融

    摘要:環(huán)境依賴修改文件,添加依賴。使用為被標(biāo)注的類去掉,允許被繼承。數(shù)據(jù)源方案一使用默認(rèn)配置使用默認(rèn)配置,不需要在創(chuàng)建和的。相關(guān)為了展現(xiàn)效果,我們先定義一組簡(jiǎn)單的接口進(jìn)行測(cè)試。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者及出處,謝謝! 本文講解 Spring Boot2 基礎(chǔ)下,如何使用 Kotlin,并無(wú)縫整合與完美交融。為了讓讀...

    golden_hamster 評(píng)論0 收藏0
  • 初探Kotlin+SpringBoot聯(lián)合編程

    摘要:是一門最近比較流行的靜態(tài)類型編程語(yǔ)言,而且和一樣同屬系。這個(gè)生成的構(gòu)造函數(shù)是合成的,因此不能從或中直接調(diào)用,但可以使用反射調(diào)用。 showImg(https://segmentfault.com/img/remote/1460000012958496); Kotlin是一門最近比較流行的靜態(tài)類型編程語(yǔ)言,而且和Groovy、Scala一樣同屬Java系。Kotlin具有的很多靜態(tài)語(yǔ)言...

    xiaokai 評(píng)論0 收藏0
  • 使用kotlin開發(fā)最新版的spring boot應(yīng)用 | SpringBoot實(shí)踐

    摘要:官方定義項(xiàng)目介紹長(zhǎng)期目標(biāo)是使用開發(fā)一個(gè)完整的應(yīng)用,目前搭建了最小量的腳手架。測(cè)試程序和都提供了強(qiáng)大的測(cè)試套件,能夠很好的和集成,進(jìn)行集成測(cè)試和單元測(cè)試。編寫一些基本的集成測(cè)試,檢查接口是否正常。 showImg(https://segmentfault.com/img/remote/1460000008751790); kotlin是由IntelliJ IDEA的開發(fā)商Jetbrain...

    mj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<