#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) 回帖