Micronaut Java 支持

2023-03-13 11:48 更新

對于 Java,Micronaut 使用 Java BeanDefinitionInjectProcessor 注解處理器在編譯時(shí)處理類并生成 BeanDefinition 類。

這里的主要優(yōu)點(diǎn)是你在編譯時(shí)付出了一點(diǎn)代價(jià),但在運(yùn)行時(shí),Micronaut 基本上是無反射的、快速的,并且消耗的內(nèi)存很少。

在 Java 9+ 中使用 Micronaut

Micronaut 是用 Java 8 構(gòu)建的,但在 Java 9 及更高版本上運(yùn)行良好。 Micronaut 生成的類與同一個(gè)包中的現(xiàn)有類并排放置,因此不會(huì)違反有關(guān) Java 模塊系統(tǒng)的任何內(nèi)容。

在 Micronaut 中使用 Java 9+ 時(shí)有一些注意事項(xiàng)。

javax.annotation 包

使用 CLI

如果您使用 Micronaut CLI 創(chuàng)建項(xiàng)目,如果您使用 Java 9+,則 javax.annotation 依賴項(xiàng)會(huì)自動(dòng)添加到您的項(xiàng)目中。

包含@PostConstruct、@PreDestroy 等的javax.annotation 已從核心JDK 移至模塊。一般來說,應(yīng)該避免使用這個(gè)包中的注解,而是使用 jakarta.annotation 等價(jià)物。

使用 Gradle 進(jìn)行增量注釋處理

Micronaut 支持 Gradle 增量注釋處理,它通過僅編譯已更改的類來加速構(gòu)建,避免完全重新編譯。

但是,默認(rèn)情況下禁用支持,因?yàn)?nbsp;Micronaut 允許定義需要配置以進(jìn)行處理的自定義元注釋(例如定義自定義 AOP 建議)。

以下示例演示了如何為您在 com.example 包下定義的注釋啟用和配置增量注釋處理:

Enabling Incremental Annotation Processing

tasks.withType(JavaCompile) {
    options.compilerArgs = [
        '-Amicronaut.processing.incremental=true',
        '-Amicronaut.processing.annotations=com.example.*',
    ]
}

如果您不為您的自定義注釋啟用處理,它們將被 Micronaut 忽略,這可能會(huì)破壞您的應(yīng)用程序。

使用 Project Lombok

Project Lombok 是一個(gè)流行的 Java 庫,它通過注釋處理器向 Java 語言添加了許多有用的 AST 轉(zhuǎn)換。

由于 Micronaut 和 Lombok 都使用注釋處理器,因此在配置 Lombok 時(shí)必須特別小心,以確保 Lombok 處理器在 Micronaut 的處理器之前運(yùn)行。

如果您使用 Gradle,請?zhí)砑右韵乱蕾図?xiàng):

Configuring Lombok in Gradle

compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor "org.projectlombok:lombok:1.18.24"
...
// Micronaut processor defined after Lombok
annotationProcessor "io.micronaut:micronaut-inject-java"

或者,如果使用 Maven:

Configuring Lombok in Maven

<dependencies>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
  </dependency>
</dependencies>
...
<annotationProcessorPaths combine.self="override">
  <path>
    <!-- must precede micronaut-inject-java -->
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
  </path>
  <path>
    <groupId>io.micronaut</groupId>
    <artifactId>micronaut-inject-java</artifactId>
    <version>${micronaut.version}</version>
  </path>
    <path>
    <groupId>io.micronaut</groupId>
    <artifactId>micronaut-validation</artifactId>
    <version>${micronaut.version}</version>
  </path>
</annotationProcessorPaths>

在這兩種情況下(Gradle 和 Maven)Micronaut 處理器必須在 Lombok 處理器之后配置。顛倒聲明的依賴項(xiàng)的順序?qū)⒉黄鹱饔谩?/p>

配置 IDE

如果您依賴配置的構(gòu)建工具(Gradle 或 Maven)來構(gòu)建應(yīng)用程序,則可以使用任何 IDE 來開發(fā) Micronaut 應(yīng)用程序。

但是,目前可以使用 IntelliJ IDEA 或 Eclipse 4.9 或更高版本在 IDE 中運(yùn)行測試。

保留參數(shù)名稱

默認(rèn)情況下,Java 不會(huì)在編譯時(shí)保留方法參數(shù)的參數(shù)名稱數(shù)據(jù)。如果您沒有顯式定義參數(shù)名稱并依賴于已編譯的外部 JAR,這對 Micronaut 來說可能是個(gè)問題。

考慮這個(gè)界面:

Client Interface

interface HelloOperations {
    @Get("/hello/{name}")
    String hello(String name);
}

在編譯時(shí),參數(shù)名稱 name 丟失并在編譯時(shí)變?yōu)?nbsp;arg0 或稍后通過反射讀取。為避免此問題,您有兩種選擇。您可以顯式聲明參數(shù)名稱:

Client Interface

interface HelloOperations {
    @Get("/hello/{name}")
    String hello(@QueryValue("name") String name);
}

或者,建議您將所有帶有 -parameters 標(biāo)志的字節(jié)碼編譯為 javac。例如在 build.gradle 中:

build.gradle

compileJava.options.compilerArgs += '-parameters'


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號