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 帮我生成一下不同传播行为的示例代码,但是一直啰嗦的要死,而且写的非常的复杂,到最后就放弃了

自己就写了几个伪代码来帮助自己去理解了

posted @ 2026-02-12 21:33  Meditation丶  阅读(18)  评论(0)    收藏  举报