大厂 Java 架构师面试题全解析

在竞争激烈的 Java 开发领域,想要晋升为架构师,面临的面试挑战不容小觑。大厂的面试官往往会从多个维度深入考察候选人的技术功底、架构设计能力、问题解决思维等。以下精心整理了 30 道大厂 Java 架构师面试题,助你一臂之力。

一、基础语法与核心库

谈谈对 Java 中 String、StringBuilder 和 StringBuffer 的理解,它们的区别与适用场景是什么?

  • 关键要点:String 不可变,每次操作产生新对象;StringBuilder 可变,非线程安全,适用于单线程下频繁字符串拼接;StringBuffer 可变且线程安全,性能稍逊于 StringBuilder,用于多线程环境字符串操作。
  • 答案:String 在 Java 中是不可变对象,一旦创建,其值不能被修改。像"+"拼接字符串时,底层会创建新的 String 对象,效率低。StringBuilder 可变,通过 append 等方法修改字符序列,不产生新对象,提升性能,单线程下大量拼接首选。StringBuffer 方法加了 synchronized 关键字,保证多线程同步访问,以牺牲部分性能为代价确保线程安全。

Java 中的异常体系是怎样的?请举例说明运行时异常和非运行时异常的区别。

  • 关键要点:Java 异常分 Error、Exception,Exception 又分运行时(RuntimeException 及其子类)和非运行时(受检异常),运行时异常编译器不强制处理,非运行时异常需 try-catch 或 throws 声明。
  • 答案:Error 表示严重错误,如 OutOfMemoryError,程序难以恢复。Exception 是程序正常运行中可处理的异常。RuntimeException 如 NullPointerException、ArrayIndexOutOfBoundsException 等,是编程错误导致,运行时抛出,代码可不显式处理。非运行时异常如 IOException,文件读写时可能抛出,方法需声明 throws 或内部 try-catch 处理,否则编译不通过。

二、多线程与并发

解释下 Java 中的线程池原理,常用的线程池有哪些,如何合理配置线程池参数?

  • 关键要点:线程池管理线程,避免频繁创建销毁,包含核心线程、任务队列、最大线程数等组件;常用 FixedThreadPool、CachedThreadPool 等;配置参数依据任务特性,如 CPU 密集型、I/O 密集型。
  • 答案:线程池基于生产者 - 消费者模式,任务提交者为生产者,线程池中的线程是消费者。核心线程数初始化就创建并一直存活,任务队列存放待执行任务,当队列满且未达最大线程数,创建新线程执行任务,超最大线程数则执行拒绝策略。FixedThreadPool 固定线程数,适用于负载稳定场景;CachedThreadPool 线程数按需创建,空闲线程 60 秒回收,应对突发大量短期任务。CPU 密集型任务,核心线程数设为 CPU 核数 + 1;I/O 密集型,根据等待时间与计算时间比例调大核心线程数,如 CPU 核数 * 2 。

说说你对 Java 中 synchronized 关键字和 Lock 接口的理解,它们有何异同?

  • 关键要点:synchronized 是 Java 内置锁,简单易用,锁对象、方法、代码块;Lock 接口更灵活,可中断锁获取、尝试非阻塞加锁、公平锁实现,需手动释放锁。
  • 答案:synchronized 修饰方法时锁当前实例对象,静态方法锁类对象,代码块锁指定对象,保证同一时刻只有一个线程进入同步代码块或方法,自动加解锁。Lock 接口常见实现 ReentrantLock,使用 lock() 加锁,unlock() 解锁,tryLock() 尝试非阻塞加锁,lockInterruptibly() 允许线程在等待锁时响应中断,能实现公平锁,按请求顺序分配锁,相比 synchronized 给予开发者更多控制权。

三、Java 虚拟机(JVM)

简述 Java 内存模型(JMM),它是如何保证可见性、有序性和原子性的?

  • 关键要点:JMM 定义主内存、工作内存抽象概念,规范多线程读写共享变量规则;通过 volatile 关键字保证可见性、禁止指令重排保证有序性,原子性靠锁、原子类等保障。
  • 答案:JMM 中,所有共享变量存主内存,线程有私有的工作内存,线程读写共享变量需先从主内存拷贝到工作内存,再写回主内存。volatile 修饰变量,保证其修改对其他线程立即可见,且禁止编译器和处理器对其指令重排,确保有序性。原子性方面,像 i++ 非原子操作,可用 synchronized 锁住变量操作代码块或使用 AtomicInteger 等原子类保证操作原子性。

谈谈 Java 垃圾回收机制(GC),常见的垃圾回收器有哪些,各自适用场景?

  • 关键要点:GC 自动回收无用对象内存,分新生代、老年代回收;常见 Serial、Parallel、CMS、G1 等回收器,依吞吐量、停顿时间等选型。
  • 答案:新生代对象朝生夕灭,采用复制算法,如 Serial 新生代回收器,单线程回收,简单高效,适用于单核 CPU 且停顿时间要求不高场景;Parallel 并行回收,多线程提升回收效率,适合对吞吐量要求高的后台运算。老年代对象存活久,空间大,CMS 以获取最短回收停顿时间为目标,分初始标记、并发标记、重新标记、并发清除阶段,适用于响应要求高的 Web 应用;G1 面向大内存、低延迟,划分多个 Region,兼顾新生代、老年代回收,优先回收垃圾多 Region,实时性好,逐渐成为主流。

四、框架知识(Spring、Spring Boot 等)

请阐述 Spring IOC 容器的原理与实现,Bean 的生命周期是怎样的?

  • 关键要点:IOC 控制反转解耦对象创建依赖,通过反射创建 Bean;Bean 生命周期包含实例化、属性赋值、初始化、销毁阶段,有对应接口方法扩展。
  • 答案:Spring IOC 容器启动读取配置(XML 或注解),解析定义的 Bean,利用反射创建实例,将依赖注入,开发者无需手动 new 对象。Bean 实例化阶段通过构造函数创建对象,接着属性赋值,调用 set 方法注入依赖,再执行初始化方法(如实现 InitializingBean 接口的 afterPropertiesSet 或自定义 init-method),容器关闭时,若实现 DisposableBean 接口,调用 destroy 方法释放资源。

解释下 Spring Boot 的自动配置原理,如何自定义自动配置?

  • 关键要点:Spring Boot 依启动类路径下依赖、约定俗成配置自动配置组件;通过条件注解、配置类、SPI 机制自定义,引入 starter 模块触发。
  • 答案:Spring Boot 主启动类的 @SpringBootApplication 开启组件扫描与自动配置。内部 @EnableAutoConfiguration 基于条件注解如 @ConditionalOnClass、@ConditionalOnMissingBean 等,根据类路径下是否存在特定类、Bean 来决定是否配置。自定义自动配置时,创建配置类,用条件注解限定生效场景,定义 Bean 方法,放入 META-INF/spring.factories 文件,打包成 starter,项目引入后依条件自动加载自定义配置。

五、分布式与微服务

说说分布式系统中的 CAP 定理,如何在实际项目中权衡取舍?

  • 关键要点:CAP 即一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),网络分区下三者难全满足,依业务侧重抉择。
  • 答案:在分布式环境,分区容错性基本要保证,因网络故障不可避免。若注重强一致性,如金融转账,数据更新需全局一致,牺牲可用性,系统更新时部分节点不可用;像电商商品详情查询,高可用优先,允许短暂数据不一致,最终一致性即可,通过异步同步数据保证数据慢慢趋于一致,不同业务场景合理偏向某特性来构建系统。

简述微服务架构下的服务发现与注册机制,常用的组件有哪些?

  • 关键要点:服务发现注册用于定位服务实例,解耦服务调用;常用组件有 Consul、Eureka、Nacos,各自有特性与优势。
  • 答案:服务启动向注册中心登记 IP、端口、服务名等信息,调用方从注册中心查询目标服务实例地址发起请求。Consul 支持多数据中心,功能全面,除服务发现,还有健康检查、配置管理,采用 Raft 一致性算法保证数据可靠;Eureka 由 Netflix 开源,简单易用,AP 模型,强调可用性,实例心跳续租维持注册信息;Nacos 阿里开源,集服务发现、配置管理、动态 DNS 于一体,适配多种生态,在国内云原生场景广泛应用,可依团队技术栈、需求复杂度选择。

六、数据库相关

请讲解 MySQL 索引的数据结构,B+树索引相比其他索引结构优势在哪?

  • 关键要点:MySQL 索引常用 B+树,还有哈希索引等;B+树有序、多层、叶子节点存数据,适合范围查询、磁盘 I/O 优化。
  • 答案:哈希索引基于哈希表实现,查询快,等值查询效率高,但不支持范围查询,无法利用索引排序。B+树是多叉平衡树,非叶子节点存索引值,叶子节点用链表相连,有序且包含全部数据记录。相比 B 树,B+树叶子节点连续存储,磁盘预读性好,一次 I/O 读取更多数据,范围查询只需遍历叶子节点链表,性能卓越,是 MySQL InnoDB 引擎索引首选。

谈一谈 MySQL 事务的隔离级别,分别会出现哪些并发问题,如何解决?

  • 关键要点:事务隔离级别有读未提交、读已提交、可重复读、串行化;级别越低并发问题越多,靠锁、MVCC 机制解决。
  • 答案:读未提交会出现脏读,一个事务读到另一个未提交事务修改数据,回滚后数据无效;通过加锁,读操作加共享锁,写操作加排它锁避免。读已提交解决脏读,但有不可重复读问题,同一事务多次读同数据,因其他事务提交修改结果不同,MySQL InnoDB 引擎用 MVCC(多版本并发控制),读取数据特定版本解决,不同事务看到不同时刻数据快照。可重复读是 InnoDB 默认级别,解决不可重复读,幻读仍可能,通过间隙锁、临键锁配合解决。串行化最高级别,事务串行执行,无并发问题,但吞吐量低,适用于对数据一致性要求极高场景。

七、性能优化

如何优化 Java 应用的性能,从代码、JVM、架构层面谈谈思路。

  • 关键要点:代码层面避免低效算法、频繁创建对象;JVM 调优堆内存、垃圾回收器;架构优化缓存、异步、分布式架构。
  • 答案:代码中,优化算法复杂度,如用 StringBuilder 替代"+"拼接;减少对象创建,复用对象,及时释放无用对象引用。JVM 层面,根据应用内存需求,调整堆内存大小,如 -Xmx、-Xms 参数;依据业务特性选合适垃圾回收器及调优参数,监控 GC 停顿时间、吞吐量。架构上,引入缓存减轻数据库压力,如 Redis 缓存热点数据;业务允许异步处理的用异步任务框架,提升响应;复杂业务拆分为微服务,独立部署、按需扩展,优化整体性能。

讲讲你对缓存雪崩、缓存穿透、缓存击穿的理解,以及如何预防解决?

  • 关键要点:缓存雪崩大批缓存同时失效,大量请求直击数据库;缓存穿透查询不存在数据穿透缓存查库;缓存击穿热点缓存失效瞬间高并发查库;各有应对策略。
  • 答案:缓存雪崩预防,设置缓存随机过期时间,避免集中失效;搭建高可用缓存集群,部分节点故障不影响整体;使用限流降级,过载时限制访问数据库。缓存穿透解决,缓存空对象,设置短过期时间;布隆过滤器提前判断数据是否存在,不存在直接返回,减少数据库查询。缓存击穿应对,热点数据永不过期,后台异步更新;加互斥锁,缓存失效时,只让一个线程查询数据库更新缓存,其他线程等待缓存更新后获取数据。

八、系统设计

设计一个高并发的分布式电商系统,谈谈关键架构点与技术选型。

  • 关键要点:涉及负载均衡、缓存、微服务、数据库分库分表、消息队列等多方面,依业务场景权衡选型。
  • 答案:入口用 Nginx 等做负载均衡,分发流量到后端集群;商品、用户等热点数据用 Redis 缓存,提升读性能;业务拆分为订单、库存、用户等微服务,独立开发部署,服务间用 Dubbo 或 Spring Cloud 通信;数据库按业务或数据量分库分表,如 ShardingSphere 中间件实现,缓解单库压力;异步处理订单流程、库存扣减等用 RabbitMQ 等消息队列解耦,确保最终一致性,全方位保障高并发、高可用、可扩展。

请设计一个短链接生成系统,要考虑高并发、高可用,简述实现思路。

  • 关键要点:短链接生成需快速、唯一,存储映射关系,应对高流量,用分布式 ID、缓存、数据库优化。
  • 答案:生成短链接可用 Snowflake 等分布式 ID 算法保证全局唯一性,快速生成短码。内存用 Redis 缓存短链接与原长链接映射,提高读写效率,设置过期时间释放空间。数据库持久化存储映射,分库分表应对大数据量,查询时先查缓存,未命中再查数据库并更新缓存。高并发下,引入限流,限制每秒生成量;集群部署短链接生成服务,Nginx 负载均衡,保障系统高可用,任一节点故障不影响服务。

九、网络通信

解释下 TCP 三次握手与四次挥手过程,为什么要这样设计?

  • 关键要点:三次握手建立连接,四次挥手断开连接,确保可靠连接建立与释放,解决网络异常、资源合理利用。
  • 答案:三次握手,客户端发 SYN 包到服务器,进入 SYN_SENT 状态,服务器收到回 SYN + ACK 包,进入 SYN_RECV 状态,客户端再发 ACK 包,双方进入 ESTABLISHED 状态,确保双方收发正常,避免历史连接干扰。四次挥手,主动关闭方发 FIN 包,进入 FIN_WAIT_1 状态,接收方回 ACK 包,进入 CLOSE_WAIT 状态,发送方等接收方处理完数据发 FIN 包,进入 LAST_ACK 状态,主动关闭方回 ACK 后关闭,四次挥手因 TCP 全双工,双方独立收发,要分别关闭读写通道,有序释放资源。

谈谈 HTTP 协议与 HTTPS 协议的区别,HTTPS 是如何保证安全传输的?

  • 关键要点:HTTP 明文传输,HTTPS 加密;HTTPS 靠 SSL/TLS 证书、加密算法、密钥交换保证机密性、完整性、认证性。
  • 答案:HTTP 协议传输数据未加密,信息易被窃取篡改,无身份认证。HTTPS 在 HTTP 基础上加 SSL/TLS 层,服务器申请数字证书,含公钥与认证信息,客户端发起请求,服务器发证书,客户端验证证书合法性,用证书公钥加密对称密钥传输,后续数据用对称密钥加密传输,加密算法保障数据机密,消息认证码(MAC)保证完整性,证书认证服务器身份,全程保障安全通信。

十、行业趋势与新技术

对云原生技术的理解,谈谈容器化、Kubernetes 在其中的作用。

  • 关键要点:云原生利用云平台优势,容器化实现应用打包部署标准化,Kubernetes 自动化容器编排管理。
  • 答案:云原生是构建、运行应用于云环境的一套技术体系。容器化以 Docker 为代表,将应用及其依赖打包成独立镜像,跨环境一致运行,解决开发、测试、生产环境差异。Kubernetes 作为容器编排引擎,负责容器部署、调度、扩缩容、自愈等,定义 Pod、Deployment、Service 等资源,实现自动化运维,如根据负载自动扩展容器实例,保障应用高可用,是云原生架构核心支撑,提升开发运维效率。

如何看待 Serverless 架构,它适用于哪些场景,有什么挑战?

  • 关键要点:Serverless 按需运行代码,免服务器管理;适合事件驱动、低频突发、快速迭代场景;面临冷启动、调试复杂、供应商锁定挑战。
  • 答案:Serverless 让开发者聚焦业务逻辑,上传函数代码,平台按需调度执行,按执行时长计费,无需关心服务器配置运维。适用于如物联网设备事件处理、文件上传后处理等低频突发任务,快速上线新功能的 Web 应用迭代场景。但函数冷启动耗时影响响应,调试困难,因运行环境抽象;依赖特定云厂商,迁移成本高,使用需权衡利弊,结合业务特性决定是否采用。

十一、数据结构与算法

请描述二叉搜索树(BST)的特性,如何实现其插入、删除、查找操作?

  • 关键要点:BST 左子树小于根,右子树大于根;插入按大小找位置插入,删除分叶子、单子树、双子树节点处理,查找类似二分查找。
  • 答案:二叉搜索树特性保证有序性,利于查找。插入操作从根节点开始,比当前节点小往左子树找,大往右子树找,找到空位置插入。删除节点,若为叶子直接删除;单子树节点,用delete()方法,若删除节点有左子树,用左子树最大节点值替换删除节点值并递归删除左子树最大节点;若有右子树,用右子树最小节点值替换并递归删除右子树最小节点。查找从根节点开始,比当前节点小往左子树找,大往右子树找,直到找到目标节点或为空。

说说红黑树(Red - Black Tree)与二叉搜索树的区别,红黑树的优势在哪?

  • 关键要点:红黑树是自平衡二叉搜索树,在二叉搜索树基础上增加颜色属性,通过特定规则维持平衡,保证高效查找、插入、删除操作。
  • 答案:二叉搜索树可能因插入删除顺序导致高度失衡,最坏情况退化为链表,时间复杂度升高。红黑树规定节点为红色或黑色,根节点为黑色,叶子节点为黑色空节点,红色节点子节点必为黑色,从任一节点到叶子节点路径上黑色节点数相同。这些规则使红黑树在插入删除时自动调整保持相对平衡,高度始终维持在 O(log n),查找、插入、删除操作时间复杂度稳定,适用于对性能要求苛刻场景,如 Java 中 TreeMap、TreeSet 底层实现。

请简述哈希表(Hash Table)解决冲突的方法,开放寻址法和链地址法的优缺点?

  • 关键要点:哈希表通过哈希函数将键映射到桶,冲突指不同键映射到同一桶,开放寻址法和链地址法是常见解决策略。
  • 答案:开放寻址法当冲突发生,按一定探测序列找下一个空闲桶存放元素,如线性探测、二次探测。优点是节省空间,无额外链表存储结构;缺点是容易产生聚集现象,降低查找效率,删除操作较复杂,可能破坏探测序列。链地址法将冲突元素以链表形式存于同一桶,优点是实现简单,查找、插入、删除在链表操作,不影响其他桶,不易产生聚集;缺点是需额外链表空间,当链表过长,查找性能下降。

十二、架构设计与实践经验

分享一次你主导的大型项目架构升级经历,遇到的最大挑战是什么,如何克服?

  • 关键要点:结合自身项目,阐述原架构问题、升级目标、技术选型,重点突出挑战应对策略,体现架构设计与问题解决能力。
  • 答案:在某电商项目,原单体架构随着业务增长,出现性能瓶颈、部署复杂、团队协作困难等问题。决定升级为微服务架构,目标是提升系统扩展性、灵活性与性能。选型上采用 Spring Cloud 全家桶构建微服务体系,用 Docker 容器化部署。最大挑战是服务拆分与数据一致性,服务拆分过细导致交互复杂,过粗又达不到效果。通过领域驱动设计(DDD)划分界限上下文,合理界定服务边界;数据一致性方面,引入消息队列异步处理核心业务流程,结合 Saga 模式保证分布式事务最终一致性,历经数月完成架构升级,系统性能、扩展性大幅提升。

在分布式系统中,如何保证数据的最终一致性?除了消息队列,还有哪些手段?

  • 关键要点:理解最终一致性含义,阐述多种实现方式,包括基于补偿机制、分布式事务协议、数据冗余设计等。
  • 答案:最终一致性指系统在一段时间后数据达到一致状态。除消息队列异步更新,还可利用补偿机制,记录操作日志,当出现不一致时,根据日志回滚或重试操作;采用分布式事务协议如 TCC(Try - Confirm - Cancel),分三个阶段,先尝试执行业务,成功后确认,失败则取消,协调不同服务资源;数据冗余设计,多副本存储,通过数据同步算法如 Paxos、Raft 保证副本间一致性,结合读写分离,读从副本,写主节点,减轻主节点压力同时保障数据最终一致。

如何设计一个高扩展性的 API 网关,要考虑哪些因素?

  • 关键要点:从流量管控、协议转换、安全认证、路由转发、插件扩展等方面阐述设计要点。
  • 答案:高扩展性 API 网关首先要能承载高并发流量,设置限流、熔断机制,防止流量洪峰冲击后端服务;支持多种协议转换,如将外部的 HTTP/HTTPS 转换为内部不同微服务适用协议;安全认证方面,集成 OAuth、JWT 等,验证请求合法性;路由转发精准,根据 URL、请求头、参数等智能路由到对应后端服务;插件扩展灵活,允许接入日志记录、监控、缓存等插件,可插拔式设计方便后续功能拓展,通过这些设计要点满足业务快速变化需求,保障系统扩展性。

十三、团队协作与沟通

作为架构师,如何与跨部门团队(如产品、测试、运维)有效沟通协作,推动项目进展?

  • 关键要点:强调沟通技巧、理解不同团队需求,建立共同目标,以项目流程为主线阐述协作方法。
  • 答案:在项目初期,与产品团队紧密沟通,深入理解业务需求,从架构角度提供可行性建议,协助产品完善功能设计,避免不合理需求导致架构风险。开发阶段,与开发团队共享架构蓝图,组织技术培训,确保开发人员理解架构意图,按规范编码;定期与测试团队交流,了解测试进展与问题,提前准备好测试环境,协助定位问题根源;运维团队方面,提前规划部署方案,提供运维手册,配合进行上线演练,出现故障时协同快速恢复。通过建立定期沟通机制,如周会、邮件日报,让各方了解项目动态,聚焦共同目标,保障项目顺利推进。

当团队成员对架构设计方案有分歧时,你如何解决?

  • 关键要点:展现包容、引导、决策能力,以事实和数据为依据,综合考虑团队意见达成共识。
  • 答案:遇到分歧,先组织公开讨论,让成员充分阐述观点,倾听不同声音,了解背后考量因素,如性能、成本、开发难度等。收集相关数据资料,例如对不同架构方案进行技术选型评估,对比性能指标、资源消耗、开发周期预估。若分歧仍难化解,结合项目优先级、团队整体技能水平、业务发展趋势等因素,权衡利弊做出决策,并向团队清晰解释决策依据,确保成员理解并支持后续工作,维护团队团结与效率。

十四、故障排查与应急处理

描述一次线上系统出现重大故障的排查与解决过程,从中吸取了什么教训?

  • 关键要点:按故障发现、定位、解决步骤详细叙述,总结经验教训,涵盖技术改进、流程优化等方面。
    • 案:曾遇线上服务响应缓慢,大量用户投诉。首先通过监控系统查看,发现 CPU、内存使用率飙升,初步判断资源瓶颈。进一步排查,利用线程 dump 分析发现某关键业务代码存在死锁,由于并发量增大触发。定位问题后,紧急重启相关服务实例,临时恢复业务;随后深入代码修复死锁问题,优化并发逻辑,如调整锁获取顺序、采用更细粒度锁。从此次故障吸取教训,完善监控指标,增加死锁检测预警;优化代码 review 流程,强化对并发代码审查;建立故障应急手册,明确各角色在紧急情况下职责,提升应急处理效率。

在分布式系统中,如果部分节点出现故障,如何快速定位并恢复,同时保证系统的持续运行?

  • 关键要点:依靠监控、日志、健康检查等手段定位故障节点,阐述故障转移、数据恢复策略保障系统可用。
  • 答案:分布式系统部署监控工具,实时采集节点 CPU、内存、网络、服务状态等指标,一旦节点指标异常触发警报。结合系统日志,分析故障前操作记录,辅助定位故障根源,如网络分区、硬件故障、软件 bug 等。定位故障节点后,若节点承载服务有副本,自动触发故障转移,将流量切换到健康副本,如 Kubernetes 通过 Pod 副本机制实现;对于数据存储节点故障,利用副本数据恢复,如基于 Raft 或 Paxos 算法的分布式存储,确保数据完整性与一致性,期间系统持续对外服务,通过这些机制保障分布式系统高可用,降低故障影响。
  • 以上 30 道面试题涵盖大厂 Java 架构师面试多方面要点,希望能帮你深入备考,祝你面试成功!
相关推荐
寻星探路5 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
曹牧7 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅8 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法8 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7258 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai