GraalVM Native support

在 Spring Framework 6.0 中引入了编译 Spring 应用程序为 GraalVM Native images 的支持基础设施。如果您不熟悉 GraalVM,它是如何与部署在 JVM 上的应用程序不同的以及这意味着什么对于 Spring 应用程序,请参考专门的 Spring Boot 3.0 GraalVM Native Image 支持文档。Spring Boot 还记录了 know limitations with the GraalVM support in Spring

GraphQL Java metadata

由于 在构建时对您的应用程序进行了静态分析,如果您的应用程序在查找静态资源、执行反射或在运行时创建 JDK 代理,那么 GraalVM 可能需要额外的提示。

GraphQL Java 在运行时执行三项任务,而原生命像是对其敏感的:

  1. 加载消息国际化的资源包

  2. 对内部类型进行一些反思以进行模式检查

  3. 对应用程序用模式注册的 Java 类型进行反射。这发生在 GraphQl Java 从应用程序类型中获取属性时

前两个项目是通过 Spring 团队贡献给 the GraalVM reachability metadata repository 的可访问性元数据处理的。当构建一个依赖于 GraphQL Java 的应用程序时,此元数据会被原生编译工具自动获取。这不能涵盖我们在列表中的第三个项目,因为这些类型是由应用程序本身提供的,并且必须通过另一种方式进行发现。

Native Server applications support

在典型的适用于 GraphQL 的 Spring 应用程序中,与 GraphQL 架构绑定的 Java 类型在 @Controller 方法签名中公开为参数或返回类型。在构建的 提前处理阶段 期间,Spring 或 GraphQL 将使用其 o.s.g.data.method.annotation.support.SchemaMappingBeanFactoryInitializationAotProcessor 发现相关类型并相应地注册可访问性元数据。如果您使用 GraalVM 支持构建一个 Spring Boot 应用程序,则所有这些都将自动完成。

如果你的应用程序“手动”注册数据提取器,那么某些类型不可发现。随后,你应使用 Spring Framework 的 @RegisterReflectionForBinding 注册它们:

include-code::GraphQlConfiguration[]<1> 此应用程序声明了一个 RuntimeWiringConfigurer,它“手动”添加了一个 DataFetcher<2> 通过这个 DataFetcherBookRepository 将公开一个 Book 类型<3> @RegisterReflectionForBinding 将为 Book 类型和作为字段公开的所有类型注册相关提示

Client support

GraphQlClient 不一定在应用程序上下文中作为 bean 存在,并且在方法签名中不会公开架构中使用的 Java 类型。因此,无法使用上面部分中描述的 AotProcessor 策略。对于客户端支持,适用于 GraphQL 的 Spring 嵌入了 客户端基础设施的相关可访问性元数据。当涉及到应用程序使用的 Java 类型时,应用程序应使用使用 @RegisterReflectionForBinding 的“手动”数据提取器:

include-code::ProjectService[]<1> 本机映像中,我们需要确保可以在运行时对 Project 执行反射<2> @RegisterReflectionForBinding 会注册与 Project 类型和所有公开为字段的类型相关的提示