spring面试高频问题---单例bean/aop/spring事务/springbean生命周期/循环依赖😄

Spring面试高频问题

一. spring的bean是线程安全的吗?

1. Spring单例bean

Spring框架中的bean默认是单例的,也可以修改为prototype.
singleton :bean在每个Spring IOC容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。

2.单例bean是线程安全的吗?

例如,如下图所示

count是可修改的成员变量需要考虑线程安全。
userService是无法修改的成员变量不需要考虑线程安全,无状态的成员变量就是安全的。

3. 问题总结

4. 面试问答

二. spring-aop

1. 什么是AOP?项目中用到了吗


AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低模块间的耦合度,同时提高了系统的可维护性。

常见的AOP使用场景:
1.记录操作日志(每一个service记录操作)
2.缓存处理(业务加缓存,写在AOP的切面拦截需要添加缓存的业务方法)
3.Spring中内置的事务处理

2. AOP记录操作日志 登录日志等等


后台有四个请求接口,需要记录操作日志,使用AOP提供的环绕通知做一个切面,相当于一个通过的代码,遇到请求的时候就可以执行这段代码。

代码解释:https://zhuanlan.zhihu.com/p/596205936?utm_id=0

3.spring事务如何实现的

Spring支持编程式事务管理和声明式事务管理两种方式。

  • 编程式事务控制:需使用TransactionTemplate来进行实现,对业务代码有侵入性,项目中很少使用
  • 声明式事务管理:声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。(常用)

4. 问题总结

三. spring事务失效的场景

1. spring事务失效的场景有哪些?


对spring框架的深入理解、复杂业务的编码经验

  • 异常捕获处理
  • 抛出检查异常
  • 非public方法

情况一:异常捕获处理
转账的代码中出现一个异常,由于这个异常会被try-catch捕获却没有抛出,所以可能导致事务失效(如果异常没有被捕获,就会发生事务回滚)

原因分析: 事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉
解决方法: 在catch块添加throw new RuntimeException(e)抛出

情况二:抛出检查异常
系统找不到指定文件,抛出一个检查异常

原因分析: Spring 默认只会回滚非检查异常
解决方法: 配置rollbackFor属性Transactional(rollbackFor=Exception.class),一旦出现异常都会被事务控制

情况三:非public方法导致事务失效
方法没有用public

原因分析: Spring为方法创建代理、添加事务通知、前提条件都是该方法是public的
解决方法: 方法改为public

问题总结

四. spring-bean的生命周期(难)

1. spring中bean的生命周期


Spring容器是如何管理和创建bean实例
方便调试和解决问题

2. BeanDefinition(Bean的定义信息)

Spring容器在进行实例化时,会将xml配置的的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean




3. 问题总结

五. Spring-bean的循环依赖

1. spring的循环引用


在创建A对象的同时需要使用的B对象,在创建B对象的同时需要使用到A对象

2. Spring的循环依赖


Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示:

如果要想打破循环依赖,就需要一个中间人的参与,这个中间人就是二级缓存。
一级和二级缓存可以解决一般对象的循环依赖

代理对象需要用到三级缓存

构造方法注入产生的循环依赖问题,使用延迟加载解决问题

3. 问题总结

posted @   xiaolifc  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示