
回首千川皆倒影 方知人世本无岸
痛点:
findByUsernameAndStatus()看似简单,背后却靠反射 + 字符串拼接 + 运行时解析…… 启动慢、调试难、Native 编译失败? 好消息:Spring Data 现在支持 AOT(Ahead-Of-Time)编译了! IntelliJ IDEA 2025.3 更是让它「所见即所得」——生成的 SQL/JPQL 直接高亮、可跳转、可断点调试!
AOT = Ahead-Of-Time(预编译) 传统 Spring Data 在运行时动态生成查询(如根据方法名拼 JPQL),而 AOT 模式会在构建阶段就把这些查询提前生成好——变成真实的 Java 代码!
✅ 好处:
只需两步:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>3.4.0version>
parent>运行构建命令后,生成的源码会出现在:
build/generated/aotSources/💡 IntelliJ IDEA 2025.3 自动识别这些目录,将其加入源码索引!
publicinterfaceQuoteRepositoryextendsJpaRepository<Quote,Long>{
List<Quote>findAllByAuthor(String author);
}IDEA 直接在方法上方内联显示生成的 JPQL:

点击

图标(或 Ctrl+Click)可跳转到真实生成的实现类:
publicList<Quote>findAllByAuthor(String author){
String queryString ="SELECT q FROM Quote q WHERE q.author = :author";
Query query =this.entityManager.createQuery(queryString);
query.setParameter("author", author);
return(List<Quote>) query.getResultList();
}AOT会展示 SQL,并列出所有映射字段:

生成代码更「接地气」——直接操作 Criteria 和 RowMapper:
{
"name": "findAllByAuthor",
"signature": "public abstract java.util.List<com.jetbrains.test.boot4.server.quote.quote>com.jetbrains.test.boot4.server.quote.QuoteRepository.findAllByAuthor(java.lang.String)",
"query": {
"query": "SELECT \"quote\".\"id\" AS \"id\", \"quote\".\"text\" AS \"text\", \"quote\".\"author\" AS \"author\", \"quote\".\"source\" AS \"source\" FROM \"quote\" WHERE \"quote\".\"author\" = :author"
}
}</com.jetbrains.test.boot4.server.quote.quote>如果生成的查询需要优化,你可以使用“内联查询”操作将其插入到 Spring Data 仓库代码中的 @Query注解里

✅ 下次 AOT 构建时,就会用你写的查询,不再依赖方法名推导!
⚠️ 默认 bootRun不会加载 AOT 代码!
必须显式开启:
在 build.gradle.kts 中添加:
tasks.named("bootRun") {
if (project.hasProperty("aot")) {
jvmArgs("-Dspring.aot.enabled=true")
systemProperty("spring.profiles.active", "aot")
}
}运行时加 -Paot:
./gradlew bootRun -Paot在pom里增加如下代码
<profile>
<id>aot</id>
<properties>
<spring-boot.run.profiles>aot,localdb</spring-boot.run.profiles>
<spring-boot.run.jvmArguments>-Dspring.aot.enabled=true</spring-boot.run.jvmArguments>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>使用这个 profile 执行如下命令:
./mvnw -Paot package spring-boot:run💡 IDEA 可直接创建对应 Run Configuration(支持断点调试!):
对于Gradle,需要如下配置

打断点后,直接进入生成的 findAllByAuthor() 方法,查看参数、SQL、结果集——无需穿透代理层!

对于maven

传统方式 | AOT + IDEA 2025.3 |
|---|---|
❓ 查询藏在黑盒里 | 👀 SQL/JPQL 直接可见 |
🐢 启动慢、反射重 | ⚡ 启动更快、内存更低 |
🐞 调试要“猜”代理 | 🔍 断点直达真实实现 |
📦 Native 编译困难 | 🧱 为 GraalVM 铺平道路 |
🌟 AOT 不是魔法,而是「把运行时成本搬到构建时」的务实选择。 借助 IntelliJ IDEA 2025.3,它终于从“高级特性”变成了“日常开发利器”。