W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Micronaut 的命令行界面包括對(duì) Kotlin 的特殊支持。要?jiǎng)?chuàng)建 Kotlin 應(yīng)用程序,請(qǐng)使用 kotlin lang 選項(xiàng)。例如:
創(chuàng)建 Micronaut Kotlin 應(yīng)用程序
$ mn create-app hello-world --lang kotlin
Micronaut 中對(duì) Kotlin 的支持建立在 Kapt 編譯器插件之上,其中包括對(duì) Java 注釋處理器的支持。要在您的 Micronaut 應(yīng)用程序中使用 Kotlin,請(qǐng)?zhí)砑舆m當(dāng)?shù)囊蕾図?xiàng)以在您的 kt 源文件上配置和運(yùn)行 kapt。 Kapt 為您的 Kotlin 類(lèi)創(chuàng)建 Java“存根”類(lèi),然后可以由 Micronaut 的 Java 注釋處理器進(jìn)行處理。存根不包含在最終編譯的應(yīng)用程序中。
從官方文檔中了解有關(guān) kapt 及其功能的更多信息。
使用 Gradle 時(shí),Micronaut 注釋處理器在 kapt 范圍內(nèi)聲明。例如:
Example build.gradle
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion" (1)
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
kapt "io.micronaut:micronaut-inject-java" (2)
kaptTest "io.micronaut:micronaut-inject-java" (3)
...
}
添加 Kotlin 標(biāo)準(zhǔn)庫(kù)
在kapt作用域下添加micronaut-inject-java依賴,這樣src/main中的類(lèi)就會(huì)被處理
在 kaptTest 范圍下添加 micronaut-inject-java 依賴項(xiàng),以便處理 src/test 中的類(lèi)。
使用與上面類(lèi)似的 build.gradle 文件,您現(xiàn)在可以使用運(yùn)行任務(wù)(由 Application 插件提供)來(lái)運(yùn)行您的 Micronaut 應(yīng)用程序:
$ ./gradlew run
下面是一個(gè)用 Kotlin 編寫(xiě)的示例控制器:
src/main/kotlin/example/HelloController.kt
package example
import io.micronaut.http.annotation.*
@Controller("/")
class HelloController {
@Get("/hello/{name}")
fun hello(name: String): String {
return "Hello $name"
}
}
在撰寫(xiě)本文時(shí),IntelliJ 的內(nèi)置編譯器不直接支持 Kapt 和注釋處理。在運(yùn)行測(cè)試或應(yīng)用程序類(lèi)之前,您必須將 Intellij 配置為運(yùn)行 Gradle(或 Maven)編譯作為構(gòu)建步驟。
首先,編輯測(cè)試或應(yīng)用程序的運(yùn)行配置,然后選擇“運(yùn)行 Gradle 任務(wù)”作為構(gòu)建步驟:
然后將類(lèi)任務(wù)添加為應(yīng)用程序或測(cè)試 testClasses 任務(wù)執(zhí)行的任務(wù):
現(xiàn)在,當(dāng)您運(yùn)行測(cè)試或啟動(dòng)應(yīng)用程序時(shí),Micronaut 將在編譯時(shí)生成類(lèi)。
或者,您可以將 IntelliJ 構(gòu)建/運(yùn)行操作完全委托給 Gradle:
使用 Gradle 和 Kapt 進(jìn)行增量注釋處理
要使用 Kapt 啟用 Gradle 增量注釋處理,必須將在使用 Gradle 進(jìn)行增量注釋處理中指定的參數(shù)發(fā)送到 Kapt。
以下示例演示了如何為您在 com.example 和 io.example 包下定義的注釋啟用和配置增量注釋處理:
Enabling Incremental Annotation Processing in Kapt
kapt {
arguments {
arg("micronaut.processing.incremental", true)
arg("micronaut.processing.annotations", "com.example.*,io.example.*")
}
}
如果您不為您的自定義注釋啟用處理,它們將被 Micronaut 忽略,這可能會(huì)破壞您的應(yīng)用程序。
Kotlin 和 AOP 建議
Micronaut 提供了一個(gè)不使用反射的編譯時(shí) AOP API。當(dāng)您使用任何 Micronaut AOP Advice 時(shí),它??會(huì)在編譯時(shí)創(chuàng)建一個(gè)子類(lèi)來(lái)提供 AOP 行為。這可能是個(gè)問(wèn)題,因?yàn)?nbsp;Kotlin 類(lèi)默認(rèn)是最終的。如果應(yīng)用程序是使用 Micronaut CLI 創(chuàng)建的,則 Kotlin 全開(kāi)放插件已配置為在使用 AOP 注釋時(shí)自動(dòng)更改類(lèi)以打開(kāi)。要自己配置它,請(qǐng)將 Around 類(lèi)添加到支持的注釋列表中。
如果您不想或不能使用全開(kāi)放插件,則必須聲明使用 AOP 注釋注釋的類(lèi)是開(kāi)放的:
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.HttpStatus
import io.micronaut.validation.Validated
import javax.validation.constraints.NotBlank
@Validated
@Controller("/email")
open class EmailController { (1)
@Get("/send")
fun index(@NotBlank recipient: String, (1)
@NotBlank subject: String): HttpStatus {
return HttpStatus.OK
}
}
如果使用@Validated AOP Advice,則需要在類(lèi)和方法級(jí)別使用open。
全開(kāi)放插件不處理方法。如果在方法上聲明 AOP 注釋,則必須手動(dòng)將其聲明為打開(kāi)。
Kotlin 和保留參數(shù)名稱
與 Java 一樣,使用 Kotlin 時(shí),方法參數(shù)的參數(shù)名稱數(shù)據(jù)不會(huì)在編譯時(shí)保留。如果您沒(méi)有顯式定義參數(shù)名稱并依賴于已編譯的外部 JAR,這對(duì) Micronaut 來(lái)說(shuō)可能是個(gè)問(wèn)題。
要使用 Kotlin 保留參數(shù)名稱數(shù)據(jù),請(qǐng)?jiān)?nbsp;build.gradle 中將 javaParameters 選項(xiàng)設(shè)置為 true:
configuration in Gradle
compileTestKotlin {
kotlinOptions {
jvmTarget = '1.8'
javaParameters = true
}
}
如果您使用帶有默認(rèn)方法的接口,請(qǐng)?zhí)砑?nbsp;freeCompilerArgs = ["-Xjvm-default=all"] 以便 Micronaut 識(shí)別它們。
或者,如果使用 Maven,則相應(yīng)地配置 Micronaut Maven 插件:
configuration in Maven
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ... -->
<build>
<plugins>
<!-- ... -->
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<configuration>
<javaParameters>true</javaParameters>
<!-- ... -->
</configuration>
<!-- ... -->
</plugin>
<!-- ... -->
</plugins>
</build>
</project>
協(xié)程支持
Kotlin 協(xié)程允許您使用命令式代碼創(chuàng)建異步應(yīng)用程序。一個(gè) Micronaut 控制器動(dòng)作可以是一個(gè)掛起函數(shù):
該函數(shù)被標(biāo)記為掛起,但實(shí)際上它不會(huì)被掛起。
該函數(shù)被標(biāo)記為掛起。
調(diào)用延遲以確保掛起函數(shù)并從不同的線程返回響應(yīng)。
當(dāng)我們只想返回一個(gè)狀態(tài)時(shí),suspend 函數(shù)也可以工作。
您還可以將 Flow 類(lèi)型用于流式傳輸服務(wù)器和客戶端。流式控制器可以返回 Flow,例如:
定義了生成 application/x-json-stream 的方法 streamHeadlinesWithFlow
Flow是使用flow創(chuàng)建的
此流發(fā)出 100 條消息
使用 emit suspend 函數(shù)進(jìn)行發(fā)射
消息之間有一秒的延遲
流媒體客戶端可以簡(jiǎn)單地返回一個(gè) Flow,例如:
@Get 方法定義為處理 APPLICATION_JSON_STREAM 類(lèi)型的響應(yīng)
返回類(lèi)型是 Flow
協(xié)程跟蹤上下文傳播
Micronaut支持跟蹤上下文的傳播。如果你從控制器動(dòng)作一直到所有的服務(wù)都使用掛起函數(shù),你不需要做任何特別的事情。然而,當(dāng)你在一個(gè)普通的函數(shù)中創(chuàng)建了coroutines時(shí),跟蹤傳播不會(huì)自動(dòng)發(fā)生。你必須使用HttpCoroutineContextFactory<CoroutineTracingDispatcher>來(lái)創(chuàng)建一個(gè)新的CoroutineTracingDispatcher并將其作為CoroutineContext使用。
下面的例子顯示了這可能是什么樣子的。
@Controller
class SimpleController(
private val coroutineTracingDispatcherFactory: HttpCoroutineContextFactory<CoroutineTracingDispatcher>
) {
@Get("/runParallelly")
fun runParallelly(): String = runBlocking {
val a = async(Dispatchers.Default + coroutineTracingDispatcherFactory.create()) {
val traceId = MDC.get("traceId")
println("$traceId: Calculating sth...")
calculateSth()
}
val b = async(Dispatchers.Default + coroutineTracingDispatcherFactory.create()) {
val traceId = MDC.get("traceId")
println("$traceId: Calculating sth else...")
calculateSthElse()
}
a.await() + b.await()
}
}
反應(yīng)性上下文傳播
Micronaut 支持從 Reactor 上下文到協(xié)程上下文的上下文傳播。要啟用此傳播,您需要包含以下依賴項(xiàng):
Gradle | Maven |
|
|
有關(guān)如何使用該庫(kù)的更多詳細(xì)信息,您可以在官方文檔中找到。
以下示例顯示了如何將 Reactor 上下文從 HTTP 過(guò)濾器傳播到控制器的協(xié)程:
通過(guò)從協(xié)程上下文中檢索 ReactorContext 來(lái)訪問(wèn) Reactor 上下文:
可以使用協(xié)程 Reactor 集成來(lái)使用掛起函數(shù)創(chuàng)建過(guò)濾器:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: