阅读(4952) (0)

Micronaut Java 支持

2023-02-23 13:52:18 更新

对于 Java,Micronaut 使用 Java BeanDefinitionInjectProcessor 注解处理器在编译时处理类并生成 BeanDefinition 类。

这里的主要优点是你在编译时付出了一点代价,但在运行时,Micronaut 基本上是无反射的、快速的,并且消耗的内存很少。

在 Java 9+ 中使用 Micronaut

Micronaut 是用 Java 8 构建的,但在 Java 9 及更高版本上运行良好。 Micronaut 生成的类与同一个包中的现有类并排放置,因此不会违反有关 Java 模块系统的任何内容。

在 Micronaut 中使用 Java 9+ 时有一些注意事项。

javax.annotation 包

使用 CLI

如果您使用 Micronaut CLI 创建项目,如果您使用 Java 9+,则 javax.annotation 依赖项会自动添加到您的项目中。

包含@PostConstruct、@PreDestroy 等的javax.annotation 已从核心JDK 移至模块。一般来说,应该避免使用这个包中的注解,而是使用 jakarta.annotation 等价物。

使用 Gradle 进行增量注释处理

Micronaut 支持 Gradle 增量注释处理,它通过仅编译已更改的类来加速构建,避免完全重新编译。

但是,默认情况下禁用支持,因为 Micronaut 允许定义需要配置以进行处理的自定义元注释(例如定义自定义 AOP 建议)。

以下示例演示了如何为您在 com.example 包下定义的注释启用和配置增量注释处理:

Enabling Incremental Annotation Processing

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

如果您不为您的自定义注释启用处理,它们将被 Micronaut 忽略,这可能会破坏您的应用程序。

使用 Project Lombok

Project Lombok 是一个流行的 Java 库,它通过注释处理器向 Java 语言添加了许多有用的 AST 转换。

由于 Micronaut 和 Lombok 都使用注释处理器,因此在配置 Lombok 时必须特别小心,以确保 Lombok 处理器在 Micronaut 的处理器之前运行。

如果您使用 Gradle,请添加以下依赖项:

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 处理器之后配置。颠倒声明的依赖项的顺序将不起作用。

配置 IDE

如果您依赖配置的构建工具(Gradle 或 Maven)来构建应用程序,则可以使用任何 IDE 来开发 Micronaut 应用程序。

但是,目前可以使用 IntelliJ IDEA 或 Eclipse 4.9 或更高版本在 IDE 中运行测试。

保留参数名称

默认情况下,Java 不会在编译时保留方法参数的参数名称数据。如果您没有显式定义参数名称并依赖于已编译的外部 JAR,这对 Micronaut 来说可能是个问题。

考虑这个界面:

Client Interface

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

在编译时,参数名称 name 丢失并在编译时变为 arg0 或稍后通过反射读取。为避免此问题,您有两种选择。您可以显式声明参数名称:

Client Interface

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

或者,建议您将所有带有 -parameters 标志的字节码编译为 javac。例如在 build.gradle 中:

build.gradle

compileJava.options.compilerArgs += '-parameters'