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

news2024/9/22 17:34:02

面试题分类总览

在这里插入图片描述

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、使用编程式事务控制。

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

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

相关文章

【星环云课堂大数据实验】kafka消息发布与订阅

文章目录 一、Kafka概述二、实验环境三、实验准备四、实验目的五、实验步骤5.1、创建Kafka Topic5.2、Kafka消息发布5.3、Kafka消息订阅 六、实验感悟 一、Kafka概述 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。该项目的目标是为处理实…

算法Day33 不会算数的小明

不会算数的小明 Description 现在有一个数字startValue,小明不会算数,只会以下两种操作: 双倍(Double):将数字乘2; 递减(Decrement):将数字减1。 给定两个整…

Python3开发笔记(简洁版)

一、开发编辑器 1. pycharm 2. IDLE(Python自带软件) 方法:Microsoft Store搜索 Python 安装 二、数据类型 Python中有以下几种主要的数据类型: 数字(Numbers)、 字符串(Strings&#xff09…

linux(centos7)mysql8.0主从集群搭建(两台机器)

docker安装:(转载)centos7安装Docker详细步骤(无坑版教程)-CSDN博客 环境信息 主数据库服务器:192.168.1.10 从数据库服务器:192.168.1.11 1. mysql8.0镜像下载 docker pull mysql:8.0.23 2.创建docke…

CMS—评论功能设计

一、需求分析 1.1、常见行为 1.敏感词过滤 2.新增评论(作品下、评论下) 3.删除评论(作品作者、上级评论者、本级作者) 4.上级评论删除关联下级评论 5.逻辑状态变更(上线、下线、废弃...) 6.上逻辑状态变更…

图片的批量建码怎么做?一图一码的制作方法

在使用图片展示内容时,经常会有同一类型的图片信息是有区别的,如果需要将每张图片批量生成二维码图片,那么出了一张一张去制作之外,有没有能够一键批量建码的功能可以解决这个问题呢?下面来给大家分享一下图片批量建码…

社交网络分析2(下):社交网络情感分析的方法、挑战与前沿技术

社交网络分析2(下):社交网络情感分析的方法、挑战与前沿技术 写在最前面7. 词嵌入(word embedding)的主要目的是什么?结合某方法简要地说明如何实现词嵌入。主要目的实现方法示例:GloVe案例分析…

透明PP专用UV胶水粘接PP材料高效率的提升生产效率

使用透明PP专用UV胶水粘接PP材料是提高生产效率的方法。以下方法,可以助您在生产中实现高效的PP材料粘接: ​1.选用合适的透明PP专用UV胶水 选择经过专门设计用于透明PP的UV胶水。这种胶水具有透明性,能保证粘接后的清晰度和外观。 2.自动…

Qt中槽函数在那个线程执行的探索和思考

信号和槽是Qt的核心机制之一,通过该机制大大简化了开发者的开发难度。信号和槽属于观察者模式(本质上是回调函数的应用)。是函数就需要考虑其是在那个线程中执行,本文讨论的就是槽函数在那个线程中执行的问题。 目录 1. connect…

关于负载和驱动能力的问题总结

这两天重新接触到了驱动能力这个说法,之前也听过,但是一直不理解是怎么回事儿,也就没有深究,现在想来,这里面还是有点门道的。 驱动能力,说的是什么呢?应该就是带载能力,而带载能力&…

热烈庆祝安徽普朗膜技术有限公司参加2024济南生物发酵展

公司自2004年注册成立以来主要业务领域主要有以乳酸、氨基酸、抗生素为主的发酵液的提取分离;醋、酱油发酵产品的产品升级,果汁、茶饮料等天然产物提取的除菌和澄清过滤;低聚木糖、低聚果糖、果葡糖浆、高果糖浆等过滤、纯化、浓缩&#xff1…

RRC下的NAS层

无线资源控制(Radio Resource Control,RRC),又称为无线资源管理(RRM)或者无线资源分配(RRA),是指通过一定的策略和手段进行无线资源管理、控制和调度,在满足服…

D34|不同路径

62.不同路径 初始思路: 1)确定dp数组以及下标的含义: dp[i][i]存放到第i1行和第i1列的方法数 2)确定递推公式: dp[i][i] dp[i -1][i] dp[i][i-1] 3)dp数组如何初始化 第0行是1; 第0列是1&a…

关于文件操作---C语言

引言 关于文件,想必大家或多或少都会有些了解,文件可以帮我们储存数据,不同格式的文件可以储存不同类型的数据,也可以将文件中的数据用不同的方式打开。电脑中的文件,是放在硬盘上的。在我们编写代码并运行的时候&…

KAKFA实践零碎记录

这里写目录标题 1 内存泄露2 生产者报错 1 内存泄露 错误信息 反复执行:创建消费者->关闭消费者后,内存缓慢上升且GC不能回收内存 错误原因 关闭消费者需要执行KafkaConsumer#close()函数 public void close() {this.close(Duration.ofMillis(30000…

12.12_黑马数据结构与算法笔记Java

目录 079 优先级队列 无序数组实现 080 优先级队列 有序数组实现 081 优先级队列 堆实现 1 082 优先级队列 堆实现 2 083 优先级队列 堆实现 3 084 优先级队列 e01 合并多个有序链表1 084 优先级队列 e01 合并多个有序链表2 085 阻塞队列 问题提出 086 阻塞队列 单锁实…

double DQN 跑 Pendulum-v1

gym-0.26.1 Pendulum-v1 环境详细信息 double DQN 实验环境 是为了体现 double DQN对高估的缓解, 因为 Pendulum-v1 reward最大是为0,可以有明显的对比。 相关论文 Deep Reinforcement Learning with Double Q-Learning 对动手深度强化学习里的代码做了一些修改。…

Java连接数据库实现用户登录和注册功能

目录 需求内容如下 示例代码 数据库studb Java代码 效果图 需求内容如下 1,创建数据库studb 2,库中添加用户表userinfo,包含如下字段 用户id ,用户名,用户密码,用户权限 (数据类型和约束自己定义&#xff09…

SpringBoot2—开发实用篇2

目录 数据层解决方案 SQL NoSQL SpringBoot整合Redis SpringBoot整合MongoDB SpringBoot整合ES 数据层解决方案 SQL 回忆一下之前做SSMP整合的时候数据层解决方案涉及到了哪些技术?MySQL数据库与MyBatisPlus框架,后面又学了Druid数据源的配置&am…

TrustGeo代码理解(一)main.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和数据库 # -*- coding: utf-8 -*- import torch.nnfrom lib.utils import * import argparse, os import numpy as np import random from lib.model import * import copy from thop import profile imp…