4.0 KiB
id, title, type, domain, stack, tags, level, related, week
| id | title | type | domain | stack | tags | level | related | week | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| backend.java-spring.interview | Java / Spring Boot(了解级)面试题 | interview | backend |
|
|
basic |
|
|
Java / Spring Boot(了解级)面试题
基础
【基础】什么是 IoC 和依赖注入?
参考答案:控制反转:对象的创建和依赖组装由容器负责,而不是对象自己 new;依赖注入是实现方式,通过构造器、setter 或字段注入。好处是解耦、便于替换实现和测试。
追问:为什么推荐构造器注入?→ 依赖可以声明为 final、不会出现未初始化的状态、单元测试时直接传入假实现。
【基础】Spring Boot 项目通常怎么分层?
参考答案:Controller 处理 HTTP 和参数校验,Service 写业务逻辑和事务边界,Repository 负责数据访问;DTO 与实体分开,全局异常处理统一返回格式。
追问:和你写的 Go 项目怎么对应?→ handler / service / repository 三层,思路一致,只是 Go 中依赖在 main 中手动组装。
【基础】Java 中金额用什么类型?
参考答案:BigDecimal(或以分为单位的 long),不能用 double,二进制浮点数无法精确表示 0.1 等小数。
追问:BigDecimal 比较相等要注意什么?→ equals 会比较精度(2.0 和 2.00 不相等),数值比较用 compareTo。
进阶
【进阶】@Transactional 在什么情况下会失效?
参考答案:同类内部方法调用(不经过代理)、方法不是 public(取决于代理方式和版本)、异常被捕获没有抛出、抛出受检异常而未配置 rollbackFor、数据库引擎不支持事务。
追问:Go 中怎么做类似的事?→ 显式开启事务并把 tx 传入各个仓储方法,或者封装一个 WithTx(func(tx) error) 帮助函数。
【进阶】虚拟线程是什么?和 goroutine 有什么相似之处?
参考答案:JDK 21 正式提供的轻量级线程,由 JVM 调度到少量平台线程上,阻塞 I/O 时让出载体线程,可以创建大量并发任务;与 goroutine 一样让“同步写法 + 高并发”成为可能。
追问:有什么需要注意?→ 不适合 CPU 密集任务;某些同步块或本地调用会“钉住”载体线程(不同 JDK 版本有改进,以官方说明为准);不要池化虚拟线程。
【进阶】Java 团队说接口“已经幂等”,你怎么验证?
参考答案:看实现:是否有唯一约束或幂等键表、状态机是否只允许合法转换;做测试:同一请求并发和重复发送,检查数据只产生一条、返回结果一致。
追问:幂等键应该谁生成?→ 调用方生成并在重试时复用;服务端存储键和结果,设定过期时间。
场景题
【场景题】你的 Python Agent 需要调用公司的 Java 订单系统,怎么做?
参考答案:读 Controller / DTO 明确契约;Python 侧封装工具,透传用户身份;错误码映射为可重试、告知用户、转人工;非幂等接口推动增加幂等键;契约测试和 request id 联调。详见调用 Java 服务场景。
追问:对方接口很慢怎么办?→ 设置超时,查询类接口加缓存,长操作改为异步(提交后轮询或回调),Agent 告诉用户“已提交,稍后通知”。
【场景题】面试官问“你会 Java 吗”,你怎么回答?
参考答案:如实说明:主语言是 Go / Python,能读懂 Spring Boot 项目的结构和代码,理解 IoC、分层、事务等核心概念,做过(或能做)与 Java 服务的对接;如果岗位需要,可以快速上手。不夸大。
追问:举个例子说明你读懂过 Java 代码?→ 讲清一次具体的对接:从哪个 Controller 读出了什么契约、发现了什么问题(例如非幂等)、怎么解决。