2026-02-12学习
2026-02-12学习
一、Spring 面试题学习
1、说一下你对 Spring 的理解
Spring 就是一种框架,能够很好的简化代码的操作,让开发者能够更好的注重业务逻辑,而非重复性操作。并且通过 IOC 控制反转和 DI 依赖注入来
自动管理对象的整个生命周期。
IOC 控制反转
IOC 控制反转就是创建对象的方式不再是手动进行 new 对象,而是通过 Spring 容器进行自动创建,代码实例:
public class A {
private B b = new B(); // 原来的方式
@Resource
private B b; // Spring 容器的方式
}
DI 依赖注入
依赖注入的方式就是:字段注入,构造函数注入,Setter 注入
整个流程就是:当 A 实例化后需要依赖注入 B,这时就会告诉容器我需要 B 进行注入,那么容器就会帮我们去找 B 的实现,找到后就注入进来。
这个流程是不是很像 Bean 的一个生命周期以及解决循环依赖问题?
2、什么是 Spring Bean?
Spring Bean 就是 Spring 容器管理 Java 创建的对象,普通的对象是靠 new 出来的,而 Spring 的对象是容器进行管理的
3、Spring 事务有哪几种传播行为?
这个之前面试一家实习 2k 的公司问到过,但是也是一脸懵,第一次听说这个,我只知道怎么开启事务,没想到还有事务传播行为
传播行为主要有 7 个,但是 7 个我们都要回答吗?那肯定不现实,我们只回答一些常见的就行了,没必要每个都说的很清楚,万一到时候忘了呢?
主要回答三个:默认的 required、requires_new、nested
required 事务传播
这个主要就是外部调用事务的时候,如果事务存在,就将事务加入进去;如果事务不存在,就新建事务
我们可以结合一个场景来理解,现在有一个下单和扣减库存两个事务,外部调用的下单的事务,那么肯定相对应的,要把扣减库存这个事务拿过来,
才能算一个完整的事务嘛。假如我们只调用扣减库存这个事务,那么外部调用发现没有事务,就自己新建一个事务。这个场景是不是还是有点抽象?
那我们再说一个最简单的,假如说现在有一个会议室,当一个团队需要讨论方案,但是这个方案需要其他部门进行配合,那么是不是就需要联系其他
部门一起开会;但是现在这个方案只有我们团队内部讨论,还需要其他部门吗,不需要对不对,那我们就自己实现嘛,这样就好理解了
requires_new 事务传播
这个呢就是不管有没有事务,我都新建一个事务,主要用于独立日志场景
当一个方法报错的时候,不管怎么样,都要将错误日志记录下来。但是现在对于日志处理,都是通过 AOP 切面变成或者拦截器来实现了,很少看到用
事务去实现
nested 事务传播
这个就是嵌套事务,父事务中包含了一层子事务,如果子事务回滚是不会影响到父事务的,但是父事务回滚的话,子事务也要进行回滚
其他事务传播
supports、not_supported、never、mandatory 想了解的自己查资料吧,作者也背不下这么多,因为一般来说,你用到才会记得很清楚,不常用
过两天就忘记了
二、复习昨天知识
简单过一遍,不详细写
1、Spring 事务怎么用?
声明式事务:使用 @Transcational 注解来开启事务
编程式事务
2、Spring 事务的隔离级别?
Spring 事务的隔离级别主要为读未提交,读已提交,可重复读,串行化
3、Spring 事务在哪些情况下会失效?
1)使用 try catch 捕获异常,但是没进行异常抛出
2)抛出的异常是编译时异常,解决方法就是使用 @Transcational(rollbackfor = Exception.class) 来进行解决
3)方法使用非 public 修饰
4、什么是循环依赖?
循环依赖问题就是 A 调用 B,B 调用 A,这样反复调用,这就是循环依赖问题
5、如何解决循环依赖?
1)三级缓存:一级缓存存储的是完整生命周期的 Bean (没有进行销毁阶段);二级缓存存储的是半成品的 Bean,只经过了实例化,但是没进行依赖
注入;三级缓存就是 ObjectFactory,主要作用就是延迟注入。
整个流程是这样的,创建 A 服务的时候,发现没有实例化,就对其实例化,并将其缓存到三级缓存中,接着进行依赖注入的时候,发现 B 也没有实例
化,那么就对 B 进行实例化,缓存到三级缓存之中,依赖注入的时候发现 A 了,那么将 A 从三级缓存中拿出来,然后放到二级缓存中,这时 B 已经
完成了整个流程了,就将 B 缓存到一级缓存之中。这时 A 接着初始化就可以了。
2)针对构造函数主要就是通过 @Lazy 进行延迟依赖注入
6、Spring Bean 的生命周期?
实例化 -> 依赖注入 -> 前置处理 -> 初始化 -> 后置处理 -> 就绪使用 -> 销毁
三、总结
今天主要被传播行为折磨了,我想让 DeepSeek 帮我生成一下不同传播行为的示例代码,但是一直啰嗦的要死,而且写的非常的复杂,到最后就放弃了
自己就写了几个伪代码来帮助自己去理解了

浙公网安备 33010602011771号