spring面试:一、面试题分类总览+bean线程安全问题+AOP相关问题(定义、使用步骤、编程式事务管理和声明式事务管理和声明式事务管理失效)

面试题分类总览

在这里插入图片描述

bean线程安全问题

单例/多例

单例(singleton):在每个spring ioc容器中都只有一个实例。
多例(prototype):在每个spring ioc容器中有多个实例。

默认情况下spring中的bean都是单例的。但是可以通过在类上添加@Scope(“prototype”)来切换成多例的作用域。

单例/多例的线程安全问题

多例一般不会有线程安全问题,因为栈中的对象分别指向堆中属于自己的成员变量。
但是单例不一定。如果单例没有成员变量,那么一般都是线程安全的。但是如果有可以改变状态的成员变量,那么就需要考虑线程安全问题,一般用多例或者加锁来解决。
譬如如下的代码

@Controller
@RequestMapping("/user")
public class UserController{private int count;@Autowiredprivate UserService userService;@GetMapping("/getById/{id}")public User getById(@PathVariable("id") Integer id){count++;return userService.getById(id);}
}

其中注入的UserService和getById方法都是线程安全的。因为他们都是无状态的,不可被改变的对象。(Service类和DAO类)
但是该类的成员变量count就是线程不安全的。

AOP

定义

AOP是一种软件开发的编程范式,又叫面向切面编程。它用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect)。这样可以减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性和复用性。像是常见的记录操作日志、缓存处理、还有Spring中内置的事务处理都是用AOP来实现的。

使用

使用AOP的一般步骤是:定义切面和切点,配置切面,织入切面,并在应用程序中触发切点。
我习惯的做法是

  • 定义切面类,即Aspect类,该类包含了@Pointcut注解来实现切点的具体实现。还有具体的通知注解,譬如前置通知、后置通知、环绕通知、异常通知等来实现抽取的具体逻辑。
  • 配置切面:譬如通过XML配置文件、注解等来完成切面的配置。
  • 织入切面:通常使用动态代理的方式织入切面。一般就是在想要织入切面的类上加入自定义的AOP注解。
  • 运行应用程序

事务管理

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

编程式事务管理

编程式事务管理:一般是基于底层的API,如TransactionDefinition 和 TransactionTemplate 等核心接口,使得开发者完全通过编程的方式来进行事务管理。现在项目比较少使用。

优点:提供了更精准的控制,相比于声明式事务管理粒度更小。
缺点:开发者需要在代码中手动实现事务的开启、提交、回滚等操作,较为繁琐。

声明式事务管理

声明式事务管理:其本质是通过AOP功能,在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,现在项目基本都用声明式事务管理。

优点:
不再需要依赖底层API来硬编码,对业务代码没有侵入性。
适用于事务边界清晰、事务属性统一的场合,譬如最经典的CRUD业务。

缺点:
存在粒度问题。其最小粒度要作用在方法上。
存在一些事务失效的情况。

声明式事务失效
异常捕获提前处理

声明式事务通知只有捕捉到了目标抛出的异常,才能进行后续的回滚处理。如果目标使用try catch自己提前处理掉异常而且没有抛出,事务通知就无法捕获,也无法回滚。

解决方案:在catch中throw new RuntimeException(e)抛出异常。

抛出受检异常/检查异常

spring默认只会回滚非受检异常/非检查异常,所以也不会捕获到该异常。

解决方案:在注解上额外配置rollbackFor属性,@Transactional(rollbackFor=Exception.class)

方法非public

Spring 为方法创建代理、添加事务通知的前提条件都是该方法是 public 的

解决方案:改为public

数据库不支持事务

解决方案:手动编写回滚操作或者迁移到支持事务的数据库中。

多线程调用

解决方案:可以尝试以下方法:
1、调整事务的隔离级别到更高级别。
2、使用乐观锁/悲观锁
3、使用分布式事务管理器

自己调用自己的内部方法

导致类根本没被spring代理,从而失效。

解决方案:可以尝试以下方法:
1、检查事务传播行为。例如,可以使用Propagation.REQUIRED传播行为,使得内部方法加入到外部方法的事务中,保证事务的一致性。
2、考虑异步调用:如果内部方法可以异步执行,并且事务一致性的要求不高,可以将内部方法改为异步调用,让其在独立的线程中执行。通过异步调用,可以避免事务嵌套导致的死锁或其他并发问题。
3、使用编程式事务控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发如何实现单用户信息查询接口

高并发如何实现单用户信息查询接口 故事情节 产品:小李,有个单用户信息查询的功能,需要你实现一下小李:这还不简单,两分钟我给你实现两分钟过去…小李:欧克了,部署上线了运维:哪个…

数组和链表-内存存储分析

1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

动态规划——斐波那契数列模型:1137.第N个泰波那契数

文章目录 题目描述算法原理1.状态表示(最重要的&#xff09;什么是状态表示&#xff1f;状态表示怎么来的呢&#xff1f;本题的状态表示 2.状态转移方程(最难的&#xff09;本题的状态转移方程 3.初始化(后三步完成剩下百分之一的细节问题&#xff09;本题的初始化 4.填表顺序本…

C语言实现快速傅立叶(FFT)(一)

1. FFT理论相关知识 FFT&#xff08;快速傅里叶变换&#xff09;其本质就是DFT&#xff0c;只不过可以快速的计算出DFT结果&#xff0c;所以首先应该理解DFT&#xff0c;DFT(Discrete Fourier Transform) 离散傅里叶变换的缩写&#xff0c;FFT(Fast Fourier Transform)快速傅里…

【算法与数据结构】376、LeetCode摆动序列

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题难点在于要考虑到不同序列的情况&#xff0c;具体来说要考虑一下几种特殊情况&#xff1a; 1、上…

4.qml 3D-Light、DirectionalLight、PointLight、SpotLight、AxisHelper类深入学习

今天我们学习灯光类 首先来学习Light类&#xff0c;它是所有灯光的虚基类&#xff0c;该类是无法创建的&#xff0c;主要是为子类提供很多公共属性。 常用属性如下所示&#xff1a; ambientColor : color&#xff0c;该属性定义在被该光照亮之前应用于材质的环境颜色。默认值…

oracle 锁表解决办法

相关表介绍 V$LOCKED_OBJECT&#xff08;记录锁信息的表&#xff09;v$session&#xff08;记录会话信息的表&#xff09;v$sql&#xff08;记录 sql 执行的表&#xff09;dba_objects&#xff08;用来管理对象&#xff0c;表、库等等&#xff09; 查询锁表的 SID select b.…

Cockpit upload文件上传漏洞(CVE-2023-1313)

0x01 产品简介 Cockpit 是一个自托管、灵活且用户友好的无头内容平台,用于创建自定义数字体验。 0x02 漏洞概述 Cockpit assetsmanager/upload接口处存在文件上传漏洞,攻击者可通过该漏洞在服务器端任意上传代码,写入后门,获取服务器权限,进而控制整个web服务器。 0x0…

Web开发伴侣 Prepros 7.17 Crack

您友好的 Web 开发伙伴&#xff0c;Prepros 编译您的文件、转译您的 JavaScript、重新加载您的浏览器并 使开发变得非常容易测试您的网站&#xff0c;以便您可以专注于制作 他们完美。 编译一切 Prepros 可以编译 Sass、Less、Stylus、Pug/Jade、Haml、Slim、CoffeeScript 和 …

翻译: 为什么需要微调大模型 Why Fine-tuning LLM

虽然RAG提供了一种方式来给大型语言模型提供额外的信息&#xff0c;但还有另一种叫做微调&#xff08;fine-tuning&#xff09;的技术&#xff0c;也是给它更多信息的一种方式。特别是&#xff0c;如果你有的上下文比大型语言模型的输入长度或上下文窗口长度更大&#xff0c;那…

如何使用ArcGIS Pro拼接影像

为了方便数据的存储和传输&#xff0c;我们在网上获取到的影像一般都是分块的&#xff0c;正式使用之前需要对这些影像进行拼接&#xff0c;这里为大家介绍一下ArcGIS Pro中拼接影像的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的…

ArcGIS Pro SDK文件选择对话框

文件保存对话框 // 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;//设置文件的保存路径SaveItemDialog saveLayerFileDialog new SaveItemDialog(){Title "Save Layer File",OverwritePrompt true,//获取或设置当同名文件已存在时是否出现…

PPT插件-好用的插件-PPT 素材该怎么积累-大珩助手

PPT 素材该怎么积累&#xff1f; 使用大珩助手中的素材库功能&#xff0c;将Word中的&#xff0c;或系统中的文本文件、图片、其他word文档、pdf&#xff0c;所有见到的好素材&#xff0c;一键收纳。 步骤&#xff1a;选中文件&#xff0c;按住鼠标左键拖到素材库界面中&…

微服务架构之争:Quarkus VS Spring Boot

在容器时代&#xff08;“Docker时代”&#xff09;&#xff0c;无论如何&#xff0c;Java仍然活着。Java在性能方面一直很有名&#xff0c;主要是因为代码和真实机器之间的抽象层&#xff0c;多平台的成本&#xff08;一次编写&#xff0c;随处运行——还记得吗&#xff1f;&a…

虚拟电厂 能源物联新方向

今年有多热&#xff1f;据上海市气象局官微消息&#xff0c;5月29日13时09分&#xff0c;徐家汇站气温达36.1℃&#xff0c;打破了百年来的当地5月份气温*高纪录。不仅如此&#xff0c;北京、四川、江西、湖南、广东、广西等地也频频发布高温预警。 伴随着居民用电急剧攀升&am…

Gitee:远程仓库步骤

第一步&#xff1a;新建仓库 第二步&#xff1a;初始化本地仓库&#xff0c;git init 创建分支 git branch 新分支名 第三步&#xff1a;git add . &#xff1a;添加到暂存区 第四步&#xff1a;git config –global user.email关联邮箱&#xff0c;user.name用户名 第…

WX小程序案例(一):弹幕列表

WXML内容 <!--pages/formCase/formCase.wxml--> <!-- <text>pages/formCase/formCase.wxml</text> --> <view class"bk bkimg"><!-- <image src"/static/imgs/ceeb653ely1g9na2k0k6ug206o06oaa8.gif" mode"scal…

使用opencv的Canny算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题&#xff0c;也是经典的技术难题之一。如何快速、精确地提取图像边缘信息&#xff0c;一直是国内外的研究热点&#xff0c;同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

【论文阅读】Uncertainty-aware Self-training for Text Classification with Few Label

论文下载 GitHub bib: INPROCEEDINGS{mukherjee-awadallah-2020-ust,title "Uncertainty-aware Self-training for Few-shot Text Classification",author "Subhabrata Mukherjee and Ahmed Hassan Awadallah",booktitle "NeurIPS",yea…

关于嵌入式开发的一些信息汇总:C标准、芯片架构、编译器、MISRA-C

关于嵌入式开发的一些信息汇总&#xff1a;C标准、芯片架构、编译器、MISRA-C 关于C标准芯片架构是什么&#xff1f;架构对芯片有什么作用&#xff1f;arm架构X86架构mips架构小结 编译器LLVM是什么&#xff1f;前端在干什么&#xff1f;后端在干什么&#xff1f; MISRA C的诞生…