提前优化

本章介绍了Spring Data的提前时间优化(AOT),这些优化建立在Spring的提前时间优化之上。spring-doc.cadn.net.cn

最佳实践

注释你的域名类型

在应用程序启动过程中,Spring 扫描类路径中的域类,以便早期处理实体。 通过用Spring Data Store专属的域名类型进行注释@Table,@Document@Entity注释 你可以帮助初步实体扫描并确保这些类型已注册管理类型用于运行提示。 在原生图像排列中无法进行类路径扫描,因此 Spring 必须使用管理类型对于初始实体集。spring-doc.cadn.net.cn

提前代码生成

提前代码生成不仅限于使用 GraalVM 原生映像,还在常规部署中具有优势,并有助于优化 jvm 的启动性能。spring-doc.cadn.net.cn

在AOT优化中,一些决策(比如数据库方言)会在构建时被冻结,并直接包含在应用设置中。spring-doc.cadn.net.cn

如果启用了预编译,Spring Data(取决于实际使用的模块)可以在AOT阶段贡献多个组件。spring-doc.cadn.net.cn

上述所有功能默认都是开启的。 不过,用户可以通过以下选项进行微调配置。spring-doc.cadn.net.cn

spring.aot.data.accessors.enabledspring-doc.cadn.net.cn

布尔标志用于控制生成类型/属性访问器中字节码的贡献spring-doc.cadn.net.cn

spring.aot.data.accessors.includespring-doc.cadn.net.cn

逗号分离的FQCN列表,用于生成的类型/属性访问器贡献字节码。 蚁式包括与包裹名称匹配的图案(例如:example.springdata.**)或类型名包含关系。 如果一个类型被包含关系和排除匹配,包含关系获胜,该类型被视为包含。spring-doc.cadn.net.cn

spring.aot.data.accessors.excludespring-doc.cadn.net.cn

FQCN 的逗号分离列表,用于跳过生成的类型/属性访问器中字节码的贡献。 Ant式排除与包名称匹配的模式(例如:example.springdata.**)或类型名称排除。 如果一个类型被包含关系和排除匹配,包含关系获胜,该类型被视为包含。spring-doc.cadn.net.cn

spring.aot.repositories.enabledspring-doc.cadn.net.cn

用于控制仓库接口源代码贡献的布尔标志spring-doc.cadn.net.cn

Spring。AOT。[module-name].repositories.enabledspring-doc.cadn.net.cn

布尔标志用于控制某个模块仓库接口源代码的贡献(例如,Cassandra,JDBC,JPA,蒙戈德)spring-doc.cadn.net.cn

spring.aot.repositories.metadata.enabledspring-doc.cadn.net.cn

布尔标志用于控制包含查询方法和实际查询字符串的 JSON 存储库元数据的贡献。 需要spring.aot.repositories.enabled被启用。spring-doc.cadn.net.cn

提前存储库

预先存储库仅适用于特定模块的命令式(非响应式)存储库接口。 识别合格查询方法的标准因实现模块而异。spring-doc.cadn.net.cn

AOT 仓库是 AOT 处理的扩展,通过预生成合格的查询方法实现实现。 查询方法对开发者来说是不透明的,其底层查询是否在查询方法调用中被执行。 AOT 仓库贡献基于导出、注释和命名查询的查询方法实现,这些查询在构建时已知。 这种优化将查询方法的处理从运行时转移到构建时,这可以显著提升性能,因为查询方法无需在每次应用启动时进行反思分析。spring-doc.cadn.net.cn

最终生成的AOT仓库片段遵循以下命名方案:<仓库FQCN>Impl__AotRepository并且被放置在与仓库接口相同的包中。spring-doc.cadn.net.cn

可以把AOT仓库类看作内部优化。 不要直接在代码中使用它们,因为生成和实现细节可能会在未来版本中发生变化。spring-doc.cadn.net.cn

存储库元数据

AOT 处理内省查询方法并收集关于仓库查询的元数据。 Spring Data 将这些元数据存储在同一包内以源仓库命名的 JSON 文件中。 仓库 JSON 元数据包含查询和片段的详细信息。 以下仓库示例如下:spring-doc.cadn.net.cn

{
  "name": "example.springdata.UserRepository",
  "module": "JDBC",
  "type": "IMPERATIVE",
  "methods": [
    {
      "name": "findBy",
      "signature": "public abstract java.util.List<example.springdata.User> example.springdata.UserRepository.findBy()",
      "query": {
        "query": "SELECT * FROM User"
      }
    },
    {
      "name": "findByLastnameStartingWith",
      "signature": "public abstract org.springframework.data.domain.Page<example.springdata.User> example.springdata.UserRepository.findByLastnameStartingWith(java.lang.String,org.springframework.data.domain.Pageable)",
      "query": {
        "query": "SELECT * FROM User u WHERE lastname LIKE :lastname",
        "count-query": "SELECT COUNT(*) FROM User WHERE lastname LIKE :lastname"
      }
    },
    {
      "name": "findByEmailAddress",
      "signature": "public abstract example.springdata.User example.springdata.UserRepository.findByEmailAddress(java.lang.String)",
      "query": {
        "query": "select * from User where emailAddress = ?1"
      }
    },
interface UserRepository extends CrudRepository<User, Integer> {

  List<User> findBy();

  Page<User> findByLastnameStartingWith(String lastname, Pageable page);

  @Query("select * from User where emailAddress = ?1")
  User findByEmailAddress(String username);
}

创建JSON元数据可以通过以下方式进行控制。spring.aot.repositories.metadata.enabled旗。spring-doc.cadn.net.cn

原生图像运行提示

作为原生镜像运行应用需要比普通JVM运行时更多的信息。 Spring Data 在 AOT 处理过程中为本地图像使用提供运行时提示。 这些特别的提示是:spring-doc.cadn.net.cn

JPA提前存储库

AOT仓库包括符合AOT处理资格的过滤方法。 这些通常是没有实现片段支持的查询方法。spring-doc.cadn.net.cn

AOT处理避免了数据库访问。 因此,它初始化内存中的休眠实例以收集元数据。 休眠配置的类型由我们的AOT元数据收集器决定。 我们更倾向于PersistentEntityTypes如果有豆子,然后退回去PersistenceUnitInfo或者我们自己发现的类型。 如果我们的类型扫描不足以满足您的安排,您可以启用直接扫描EntityManagerFactory通过配置spring.aot.jpa.repositories.use-entitymanager=true财产。spring-doc.cadn.net.cn

支持的功能spring-doc.cadn.net.cn