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

面试题分类总览

在这里插入图片描述

bean线程安全问题

单例/多例

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

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

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

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

@Controller
@RequestMapping("/user")
public class UserController{
	private int count;
	@Autowired
	private 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、使用编程式事务控制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java SSM框架实现智能停车场系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现智能停车场系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述…

call 和 apply:改变对象行为的秘密武器(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

TSINGSEE视频智能解决方案边缘AI智能与后端智能分析的区别与应用

视频监控与AI人工智能的结合是当今社会安全领域的重要发展趋势。随着科技的不断进步,视频监控系统已经不再局限于简单的录像和监视功能,而是开始融入人工智能技术,实现更加智能化的监控和安全管理。传统的监控系统往往需要人工操作来进行监控…

内网渗透测试基础——Windows PowerShell篇

内网渗透测试基础——Windows PowerShell篇 1. Windows PowerShell基础 Windows PowerShell是一种命令行外壳程序和脚本环境,它内置在每个受支持的Windows版本中(Windows7、Windows Server 2008 R2及更高版本),为Windows命令行使…

讨好型人格最适合从事什么职业?

讨好型人格,其言行不是考虑个人,而是以满足对方为主,只要是他人的想法,都会尽力去满足,特别害怕自己做了什么事情,让对方产生不满的想法。遇到事情,也很难主动请求别人,总是依靠自己…

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)

文章目录 call指令和ret指令高级语言的函数调用x86汇编语言的函数调用call ret指令小结其他问题 如何访问栈帧函数调用栈在内存中的位置标记栈帧范围:EBP ESP寄存器访问栈帧数据:push pop指令访问栈帧数据:mov指令小结 如何切换栈帧函数返回时…

APP安全测试填坑

在实习过程中,我接触到了一些SDL安全提测的工作。原来我是学web端渗透比较多的,移动端这块基本没怎么试过手,结果刚开始一直踩坑,连抓包都抓不到(T▽T)。 下面记录下我遇到的部分问题和解决方法&#xff0…

Python基础04-数据容器

零、文章目录 Python基础04-数据容器 1、了解字符串 &#xff08;1&#xff09;字符串的定义 字符串是 Python 中最常用的数据类型。我们一般使用引号来创建字符串。创建字符串很简单&#xff0c;只要为变量分配一个值即可。<class ‘str’>即为字符串类型。一对引号…

【C++干货铺】会搜索的二叉树(BSTree)

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 前言&#xff1a; 二叉搜索树 二叉搜索树概念 二叉搜索树操作 二叉搜索树的查找 二叉搜索树的插入 二叉搜索树元素的删除 ​二叉搜索树的实现 BSTree结点 …

人工智能导论习题集(4)

第六章&#xff1a;机器学习 题1题2题3 题1 题2 题3

大型网站架构演进过程

架构演进 大型网站的技术挑战主要来自于庞大的用户&#xff0c;高并发的访问和海量的数据&#xff0c;任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户&#xff0c;问题就会变得很棘手。大型网站架构主要就是解决这类问题。 架构选型是根据当前业务需要来的&…

系列六、Springboot整合Spring Session

一、概述 在互联网发展的起始阶段&#xff0c;一般使用的是单服务架构&#xff0c;由于只有一台服务器&#xff08;Tomcat&#xff09;&#xff0c;所有的请求和响应都是基于这台服务器实现的&#xff0c;那么就不存在session共享的问题&#xff0c;但是在互联网发展的今天&…

SpringData自定义操作

一、JPQL和SQL 查询 package com.kuang.repositories;import com.kuang.pojo.Customer; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingR…

Datawhale聪明办法学Python(task3变量与函数)

一、课程基本结构 课程开源地址&#xff1a;课程简介 - 聪明办法学 Python 第二版 章节结构&#xff1a; Chapter 0 安装 Installation Chapter 1 启航 Getting Started Chapter 2 数据类型和操作 Data Types and Operators Chapter 3 变量与函数 Variables and Functions Ch…

NE555芯片

首先看一下NE555芯片的实物图以及电路符号&#xff0c;如下图所示。 NE555是使用很广泛且很受欢迎的芯片之一。上到航空航天火箭&#xff0c;下到电子玩具都能看到它的身影。 下图是它的内部结构图&#xff0c;可以更快的去学习并且上手使用这个芯片。最上面是3个5k的电阻&am…

javaEE -17(13000字 CSS3 入门级教程)

一&#xff1a;CSS3 简介 CSS3 是 CSS2 的升级版本&#xff0c;它在 CSS2 的基础上&#xff0c;新增了很多强大的新功能&#xff0c;从而解决一些实际面临的问题&#xff0c;CSS3 在未来会按照模块化的方式去发展&#xff1a;https://www.w3.org/Style/CSS/current-work.html …

DS八大排序之冒泡排序和快速排序

前言 前两期我们已经对"插入排序"&#xff08;直接插入排序和希尔排序&#xff09; 和 "选择排序"&#xff08;直接选择排序和堆排序&#xff09;进行了详细的介绍~&#xff01;这一期我们再来详细介绍一组排序 &#xff1a;"交换排序"即耳熟能…

k8s-1.23版本安装

一、主机初始化 1、修改主机名 hostnamectl set-hostname master hostnamectl set-hostname node1 hostnamectl set-hostname node2 hostnamectl set-hostname node32、主机名解析 echo 192.168.1.200 master >> /etc/hosts echo 192.168.1.201 node1 >>…

普冉(PUYA)单片机开发笔记(10): I2C通信-配置从机

概述 I2C 常用在某些型号的传感器和 MCU 的连接&#xff0c;速率要求不高&#xff0c;距离很短&#xff0c;使用简便。 I2C的通信基础知识请参见《基础通信协议之 IIC详细讲解 - 知乎》。 PY32F003 可以复用出一个 I2C 接口&#xff08;PA3&#xff1a;SCL&#xff0c;PA2&a…

时序预测 | Python实现XGBoost电力需求预测

时序预测 | Python实现XGBoost电力需求预测 目录 时序预测 | Python实现XGBoost电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前最先进的行业预测进行比较…