首页 > 阿里(天猫事业部)Java开发工程师 二面
头像
JAVA大厂圣经
编辑于 昨天 14:55 广东
+ 关注

阿里(天猫事业部)Java开发工程师 二面

#JAVA##JAVA面经##JAVA内推#

1. @EnableAutoConfiguration 注解具体做了什么?

思路

讲清楚三件事:去哪里读配置、按什么条件加载、最终帮我们做什么。突出 Spring Boot 自动配置的核心机制。

回答示例

面试官您好,这个注解是 Spring Boot 实现自动配置的核心。

它主要做三件事:

第一,去 META-INF 下面读所有预先写好的自动配置类,比如数据源、Redis、MyBatis 这些;

第二,根据你项目里引了什么依赖,来判断哪些配置需要生效;

第三,把符合条件的 Bean 自动注入到 Spring 容器里,我们不用再手动写 XML 或者配置类。

简单说,就是帮我们省去大量重复配置,实现约定大于配置。

2. MyBatis 中 #{} 和 ${} 最核心的区别是什么?

思路

抓住两点:是否预编译、是否防 SQL 注入。一句话点透本质。

回答示例

最核心的区别就两点:

#{} 是预编译的,安全,防 SQL 注入;

${} 是直接字符串拼接,不安全,有注入风险。

平时传参数一定要用 #{},只有动态表名、动态列名这种必须拼接的时候,才不得已用 ${},而且一定要做参数校验。

3. 项目里 @Transaction 注解失效过吗?举个实际例子。

思路

用最经典、最真实的场景:同类内部方法调用,讲清楚为什么失效、怎么解决。

回答示例

失效过,我遇到最典型的就是同一个类里方法互相调用导致事务不生效

比如我在 A 方法里调本类的 B 方法,B 上加了事务,抛异常也不回滚。

原因就是 Spring 事务是基于动态代理的,必须走代理对象调用事务方法才管用,内部直接调用不走代理,所以事务就失效了。

我后来是把 B 方法抽到另一个 Service 里,注入进来调用,事务就正常了。

4. 你用 Redis 存了什么类型的数据?

思路

按业务场景说,结构对应场景,显得你真用过,不是背八股。

回答示例

我在项目里这几种最常用:

  • String:存用户信息、商品详情、库存数量、接口限流计数;
  • Hash:存对象,比如订单信息、用户配置,方便单独改某个字段;
  • List:做简单队列,比如日志、通知;
  • ZSet:用来做延迟队列,比如订单超时未支付自动取消;
  • Set:存去重数据,比如用户权限、已读消息。

基本都是根据业务场景选对应结构。

5. 什么是缓存穿透?

思路

讲清楚:查不存在的数据,一直打库。给方案。

回答示例

缓存穿透就是:有人查一个缓存和数据库里都不存在的数据

缓存里没有,就每次都去查数据库,高并发下很容易把库打挂。

比如恶意请求一堆不存在的商品 ID。

解决一般用缓存空值,或者布隆过滤器过滤掉无效请求。

6. 什么是缓存击穿?

思路

突出:一个热点 Key 过期,大量请求瞬间打库。

回答示例

缓存击穿是指:,这

全部评论

(2) 回帖
加载中...
话题 回帖

近期热帖

热门推荐