校招 未知部门 / 后端-Java / 二面

[面试日期] 2026-03-18 [面试时长] 未知
[学校背景] 未知 | 未知 [学历背景] 未知
[发布人] 面试之星官方收录
<h2>阿里(天猫事业部)Java开发工程师 二面</h2> <p><span>#JAVA##JAVA面经##JAVA内推#</span></p> <h1>1. @EnableAutoConfiguration 注解具体做了什么?</h1> <h2>思路</h2> <p>讲清楚三件事:去哪里读配置、按什么条件加载、最终帮我们做什么。突出 Spring Boot 自动配置的核心机制。</p> <h2>回答示例</h2> <p>面试官您好,这个注解是 Spring Boot 实现自动配置的核心。</p> <p>它主要做三件事:</p> <p>第一,去 META-INF 下面读所有预先写好的自动配置类,比如数据源、Redis、MyBatis 这些;</p> <p>第二,根据你项目里引了什么依赖,来判断哪些配置需要生效;</p> <p>第三,把符合条件的 Bean 自动注入到 Spring 容器里,我们不用再手动写 XML 或者配置类。</p> <p>简单说,就是帮我们<strong>省去大量重复配置</strong>,实现约定大于配置。</p> <h1>2. MyBatis 中 #{} 和 ${} 最核心的区别是什么?</h1> <h2>思路</h2> <p>抓住两点:是否预编译、是否防 SQL 注入。一句话点透本质。</p> <h2>回答示例</h2> <p>最核心的区别就两点:</p> <p><strong>#{} 是预编译的,安全,防 SQL 注入;</strong></p> <p><a>${} 是直接字符串拼接,不安全,有注入风险。</a></p> <p>平时传参数一定要用 #{},只有动态表名、动态列名这种必须拼接的时候,才不得已用 ${},而且一定要做参数校验。</p> <h1>3. 项目里 @Transaction 注解失效过吗?举个实际例子。</h1> <h2>思路</h2> <p>用最经典、最真实的场景:同类内部方法调用,讲清楚为什么失效、怎么解决。</p> <h2>回答示例</h2> <p>失效过,我遇到最典型的就是<strong>同一个类里方法互相调用导致事务不生效</strong>。</p> <p>比如我在 A 方法里调本类的 B 方法,B 上加了事务,抛异常也不回滚。</p> <p>原因就是 Spring 事务是基于动态代理的,必须走代理对象调用事务方法才管用,内部直接调用不走代理,所以事务就失效了。</p> <p>我后来是把 B 方法抽到另一个 Service 里,注入进来调用,事务就正常了。</p> <h1>4. 你用 Redis 存了什么类型的数据?</h1> <h2>思路</h2> <p>按业务场景说,结构对应场景,显得你真用过,不是背八股。</p> <h2>回答示例</h2> <p>我在项目里这几种最常用:</p> <ul> <li>String:存用户信息、商品详情、库存数量、接口限流计数;</li> <li>Hash:存对象,比如订单信息、用户配置,方便单独改某个字段;</li> <li>List:做简单队列,比如日志、通知;</li> <li>ZSet:用来做延迟队列,比如订单超时未支付自动取消;</li> <li>Set:存去重数据,比如用户权限、已读消息。</li> </ul> <p>基本都是根据业务场景选对应结构。</p> <h1>5. 什么是缓存穿透?</h1> <h2>思路</h2> <p>讲清楚:查<strong>不存在的数据</strong>,一直打库。给方案。</p> <h2>回答示例</h2> <p>缓存穿透就是:<strong>有人查一个缓存和数据库里都不存在的数据</strong>。</p> <p>缓存里没有,就每次都去查数据库,高并发下很容易把库打挂。</p> <p>比如恶意请求一堆不存在的商品 ID。</p> <p>解决一般用缓存空值,或者布隆过滤器过滤掉无效请求。</p> <h1>6. 什么是缓存击穿?</h1> <h2>思路</h2> <p>突出:<strong>一个热点 Key 过期</strong>,大量请求瞬间打库。</p> <h2>回答示例</h2> <p>缓存击穿是指:,这时候一瞬间大量请求进来,缓存没命中,全部打</p>
AI 推荐面试题