当前位置: 首页 > article >正文

面试题:Spring(一)

1. Spring框架中bean是单例么?

@Service
@Scope("singleton")
public class UserServiceImpl implements UserService {    }
  • singleton : bean在每个Spring IOC容器中只有一个实例。
  • prototype:一个bean的定义可以有多个实例。

2. Spring框架中的单例bean是线程安全的么?

9499a7ccd7184dc0838d83211d0f291c.png

不是线程安全的 Spring框架中有一个@Scope注解,默认的值就是singleton,单例的。 因为一般在spring的bean的中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决 

d1653975292b437c841df0c3e05ae6db.png 

3. AOP

Spring:AOP

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

 

常见的AOP使用场景:

  1. 记录操作日志
  2. 缓存处理
  3. Spring中内置的事务处理 

1eb712f1e05c485888f69d201f3a2588.png4. 事务

Spring:事务 

Spring失效场景

cfb4169ba93e47f4a86fb3e71947c341.pngc15dcb04171b45e39a8143dfefc2f401.pngf073d5f6f2a94a53aa55dcce01ce4753.png

Spring中事务失效的场景有哪些 

  1. 异常捕获处理,自己处理了异常,没有抛出,解决:手动抛出
  2. 抛出检查异常,配置rollbackFor属性为Exception
  3. 非public方法导致的事务失效,改为public

5. bean的生命周期?

36515dd407b74723ba3762fbafbbc8b6.png

4f18a630578f4528bc86fb542e850123.png

6. 如何解决Spring中的循环引用?

99c9762bc5384d699e145df7757276ab.png Spring中的循环引用

  • 循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A
  • 循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖
  1. 一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
  2. 二级缓存:缓存早期的bean对象(生命周期还没走完)
  3. 三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

41c7fe0dfe3d46acbda14a8bc9ec0a7d.png 

构造方法出现循环依赖怎么解决?

当您在Spring的一个bean的依赖项上使用@Lazy注解时,Spring不会立即创建该依赖项的bean实例。相反,它会创建一个代理对象(在大多数情况下是JDK动态代理或CGLIB代理),该代理对象会在实际调用方法时懒加载真正的bean实例。

  1. 当Spring尝试创建BeanA的实例时,它注意到BeanA的构造器依赖于BeanB
  2. 由于BeanB被标记为@Lazy,Spring不会立即创建BeanB的实例。相反,它会为BeanB创建一个代理对象,并将其注入到BeanA中。
  3. 类似地,当Spring尝试创建BeanB的实例时,它注意到BeanB的构造器依赖于BeanA。但此时,BeanA的实例已经存在(尽管它包含一个BeanB的代理),因此Spring可以安全地创建BeanB的实例(实际上是BeanB的代理所指向的实例,但在这个上下文中,重要的是BeanB的构造器不再等待BeanA的完整实例)。
  4. BeanABeanB中的方法首次尝试访问对方(通过代理对象)时,Spring才会实际创建并初始化缺失的bean实例。

 


http://www.kler.cn/a/385568.html

相关文章:

  • c/c++--struct对比
  • 论文分享:DiskANN查询算法
  • 【大数据学习 | kafka高级部分】kafka中的选举机制
  • 深入解析Hadoop:大数据处理的基石
  • Sharding运行模式、元数据、持久化详解
  • VideoChat:开源的数字人实时对话系统,支持自定义数字人的形象和音色
  • 密码忘记了,如何取消excel编辑限制?
  • Hue组件相关问题-持续更新
  • 理解Rust 生命周期、所有权和借用机制
  • 运维故障与排查技巧
  • 【JavaEE进阶】导读
  • C++代码优化(二): 区分接口继承和实现继承
  • 【从零开始的LeetCode-算法】3254. 长度为 K 的子数组的能量值 I
  • linux服务器通过手机USB共享网络
  • 青少年编程与数学 02-003 Go语言网络编程 17课题、Go语言Cookie编程
  • 【HarmonyOS Next】封装一个网络请求模块
  • [vulnhub] DarkHole: 2
  • Android亮屏Job的功耗优化方案
  • django电商易购系统-计算机设计毕业源码61059
  • 阿里云ECS服务器使用限制及不允许做的事情
  • ai辅助开发一个简单的在线购物网站
  • VMware _ESXI安装初探
  • Kubernetes 调度器调度策略的资源分配不均问题如何解决?
  • 鸿蒙系统的优势 开发 环境搭建 开发小示例
  • 责任链模式(Chain of Responsibility Pattern)详解
  • 探索LINQ在C#中的应用:从基本查询到数据联接