2024年java面试(二)--spring篇
文章目录
- 1.spring事务传播机制
- 2.spring事务失效原因
- 3.Bean的生命周期
- 4.Bean作用域
- 5.依赖注入三种方式(Ioc的三种实现方式)
- 6.实例化bean的三种方式
- 7.IOC容器初始化加载Bean流程
1.spring事务传播机制
声明式事务虽然优于编程式事务,但也有不足,声明式事务管理的粒度是方法级别,而编程式事务是可以精确到代码块级别的。
要想实现事务管理和业务代码的抽离,就必须得用到 Spring 当中的AOP,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。
①.声明式
在配置文件中设置以下6项
(1) required
如果客户端没有事务 在bean中新起一个事务
如果客户端有事务bean 中就加进去
| 子事务 | 主事务 | 结果 |
|---|---|---|
| 异常 | 正常,并try-catch异常 | 均回滚 |
| 正常 | 异常 | 均回滚 |
| 正常 | 异常,并try-catch异常 | 不回滚 |
(2)requiresNew
不管客户端有没有事务服务器段都新起一个事务
如果客户端有事务就将事务挂起
| 子事务 | 主事务 | 结果 |
|---|---|---|
| 异常 | 正常,并try-catch异常 | 子回滚,主不回滚 |
| 正常 | 异常 | 子不回滚,主回滚 |
| 异常 | 正常 | 均回滚 |
(3)supports
如果客户端没有事务服务端也没有事务
如果客户端有事务服务端就加一个事务
(4)mandatcry
如果客户端没有事务服务端就会报错
如果客户端有事务服务端就加事务
(5)notSupported
不管客户端有没有事务服务端都没有事务
如果客户端有事务服务端就挂起
(6)never
不管客户端有没有事务服务端都没有事务
如果客户端有事务就报错
(7)NESTED
如果当前存在事务,则在嵌套事务内执行。
如果当前没有事务,则进行与REQUIRED类似的操作
| 子事务 | 主事务 | 结果 |
|---|---|---|
| 异常 | 正常,并try-catch异常 | 子回滚,主不回滚 |
| 正常 | 异常 | 均回滚 |
| 异常 | 正常 | 均回滚 |
②.编程式事务
Javax.transaction.UserTranscation
JTA 事务可以精确到事务的开始和结束
2.spring事务失效原因
①.service没有托管给spring
失效原因: spring事务生效的前提是,service必须是一个bean对象
解决方案: 将service注入spring
②抛出受检异常
失效原因: spring默认只会回滚非检查异常和error异常
解决方案: 配置rollbackFor
③业务自己捕获了异常(try-catch)
失效原因: spring事务只有捕捉到了业务抛出去的异常,才能进行后续的处理,如果业务自己捕获了异常,则事务无法感知。
解决方案:
(1)将异常原样抛出;
(2)设置TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
④切面顺序导致
失效原因: spring事务切面的优先级顺序最低,但如果自定义的切面优先级和他一样,且自定义的切面没有正确处理异常,则会同业务自己捕获异常的那种场景一样
解决方案:
(1)在切面中将异常原样抛出;
(2)在切面中设置TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
⑤非Public方法
失效原因: spring事务默认生效的方法权限都必须为public
解决方案:
(1)将方法改为public;
(2)修改TansactionAttributeSource,将publicMethodsOnly改为false
⑥父子容器
失效原因: 子容器扫描范围过大,将未加事务配置的serivce扫描进来
解决方案:
(1)父子容器个扫个的范围;
(2)不用父子容器,所有bean都交给同一容器管理
⑦方法用final/static修饰
失效原因: 因为spring事务是用动态代理实现,因此如果方法使用了final修饰,则代理类无法对目标方法进行重写,植入事务功能
解决方案: 方法不要用final修饰
⑧调用本类方法
失效原因: 本类方法不经过代理,无法进行增强
解决方案:
(1)注入自己来调用;
(2)使用@EnableAspectJAutoProxy(exposeProxy = true) + AopContext.currentProxy()
⑨多线程调用
失效原因: 因为spring的事务是通过数据库连接来实现,而数据库连接spring是放在threadLocal里面。同一个事务,只能用同一个数据库连接。而多线程场景下,拿到的数据库连接是不一样的,即是属于不同事务
⑩错误的传播行为
失效原因: 使用的传播特性不支持事务
⑪使用了不支持事务的存储引擎
失效原因: 使用了不支持事务的存储引擎。比如mysql中的MyISAM
⑫数据源没有配置事务管理器
注: 因为springboot,他默认已经开启事务管理器。
⑬被代理的类过早实例化
失效原因: 当代理类的实例化早于AbstractAutoProxyCreator后置处理器,就无法被AbstractAutoProxyCreator后置处理器增强
3.Bean的生命周期
①默认情况下,IOC容器中bean的生命周期分为五个阶段:
(1)调用构造器 或者是通过工厂的方式创建Bean对象
(2)给bean对象的属性注入值
(3)调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的
(4)使用
(5)IOC容器关闭时, 销毁Bean对象
②当加入了Bean的后置处理器后,IOC容器中bean的生命周期分为七个阶段:
调用构造器 或者是通过工厂的方式创建Bean对象
(1)给bean对象的属性注入值
(2)执行Bean后置处理器中的 postProcessBeforeInitialization
(3)调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的
(4)执行Bean的后置处理器中 postProcessAfterInitialization
(5)使用
(6)IOC容器关闭时, 销毁Bean对象
4.Bean作用域
| 名称 | 作用域 |
|---|---|
| singleton | 单例对象,默认值的作用域 |
| prototype | 每次获取都会创建⼀个新的 bean 实例 |
| request | 每⼀次HTTP请求都会产⽣⼀个新的bean,该bean仅在当前HTTP request内有效。 |
| session | 在一次 HTTP session 中,容器将返回同一个实例 |
| global-session | 将对象存入到web项目集群的session域中,若不存在集群,则global session相当于session |
默认作用域是singleton,多个线程访问同一个bean时会存在线程不安全问题
5.依赖注入三种方式(Ioc的三种实现方式)
①构造方法注入
②setter注入
③基于注解的注入
6.实例化bean的三种方式
①无参构造方法实例化(Spring默认,常用,需要bean类中存在无参构造方法);
②静态工厂实例化
③实例化工厂实例化
7.IOC容器初始化加载Bean流程
@Override
public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) {// 第一步:刷新前的预处理 prepareRefresh();//第二步: 获取BeanFactory并注册到 BeanDefitionRegistryConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 第三步:加载BeanFactory的预准备工作(BeanFactory进行一些设置,比如context的类加载器等)prepareBeanFactory(beanFactory);try {// 第四步:完成BeanFactory准备工作后的前置处理工作 postProcessBeanFactory(beanFactory);// 第五步:实例化BeanFactoryPostProcessor接口的Bean invokeBeanFactoryPostProcessors(beanFactory);// 第六步:注册BeanPostProcessor后置处理器,在创建bean的后执行 registerBeanPostProcessors(beanFactory);// 第七步:初始化MessageSource组件(做国际化功能;消息绑定,消息解析); initMessageSource();// 第八步:注册初始化事件派发器 initApplicationEventMulticaster();// 第九步:子类重写这个方法,在容器刷新的时候可以自定义逻辑 onRefresh();// 第十步:注册应用的监听器。就是注册实现了ApplicationListener接口的监听器registerListeners();//第十一步:初始化所有剩下的非懒加载的单例bean 初始化创建非懒加载方式的单例Bean实例(未设置属性)finishBeanFactoryInitialization(beanFactory);//第十二步: 完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,完成创建finishRefresh();}……
}
四个阶段
①实例化 Instantiation
②属性赋值 Populate
③初始化 Initialization
④销毁 Destruction
多个扩展点
①影响多个Bean
BeanPostProcessor
InstantiationAwareBeanPostProcessor
②影响单个Bean
Aware
完整流程
①实例化一个Bean--也就是我们常说的new;
②按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;
③如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,也就是根据就是Spring配置文件中Bean的id和name进行传递
④如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现setBeanFactory(BeanFactory)也就是Spring配置文件配置的Spring工厂自身进行传递;
⑤如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,和4传递的信息一样但是因为ApplicationContext是BeanFactory的子接口,所以更加灵活
⑥如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization()方法,BeanPostProcessor经常被用作是Bean内容的更改,由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术
⑦如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
⑧如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(),打印日志或者三级缓存技术里面的bean升级
⑨以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。
⑩当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,或者根据spring配置的destroy-method属性,调用实现的destroy()方法
相关文章:
2024年java面试(二)--spring篇
文章目录 1.spring事务传播机制2.spring事务失效原因3.Bean的生命周期4.Bean作用域5.依赖注入三种方式(Ioc的三种实现方式)6.实例化bean的三种方式7.IOC容器初始化加载Bean流程 1.spring事务传播机制 声明式事务虽然优于编程式事务,但也有不…...
cyclictest stress 工具 使用
工具介绍 1. Cyclictest 准确且重复地测量线程的预期唤醒时间与它实际唤醒的时间之间的差异,以提供有关系统延迟的统计数据。 它可以测量由硬件、固件和操作系统引起的实时系统延迟 2.stress是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行…...
天合翔宇荣获 HICOOL 2023 全球创业者大赛决赛二等奖
8 月 25 日晚,主题为“聚势创新 向光而行”的 HICOOL2023 全球创业者峰会开幕式,在中国国际展览中心(顺义馆)举行。北京市委书记尹力宣布开幕,市委副书记、市长殷勇致辞,市委副书记刘伟出席。 开幕式之后&…...
【LeetCode75】第三十五题 统计二叉树中好节点的数目
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 给我们一棵二叉树,让我们统计这棵二叉树中好节点的数目。 那么什么是好节点,题目中给出定义,从根节点…...
探究排序算法:比较与非比较排序算法及性能分析
探究排序算法:比较与非比较排序算法及性能分析 排序算法是计算机科学中的基本问题,它涉及将一组元素按照特定的顺序排列。本文将深入介绍比较排序算法和非比较排序算法,包括每个算法的原理、Java代码示例以及它们的性能分析和比较。 比较排…...
如何输出高质量软文,媒介盒子教你4大技巧
作为一名软文作者,只有知道软文写作的要求,才能打造一篇成功的软文,以便为企业或产品带来较高的关注度和曝光率,提高企业的知名度和品牌形象。下面就随小编一起来看看吧! 1、吸引眼球的标题 标题是软文写作的灵魂&am…...
用centos7镜像做yum仓库
用centos7镜像做yum仓库,公司全部服务器使用。 小白教程,一看就会,一做就成。 1.先下载对应版本的centos7的DVD版或Everything版 我用的是DVD的,比Everything版小,功能也挺全,这里里centos7.5的镜像做实验…...
【无法联网】电脑wifi列表为空的解决方案
打开电脑, 发现wifi列表为空, 点击设置显示未连接 首先检查是不是网卡驱动有问题, cmd, devmgmt.msc 找到网络适配器, 看看网卡前面是否有感叹号, 如果没有则说明网卡没问题, 有问题则重装驱动 看看网络协议是否设置正确 找到"控制面板\所有控制面板项\网络和共享中心&…...
Ajax-Axios的快速入门
Ajax 概念:Asynchronous Javascript Anderson XML,异步的JavaScript和XML 作用:数据交换:通过Ajax可以给服务器发送请求,并获取服务器相应数据 异步交互:可以在不重新加载整个页面的情况下,与…...
mysql insert出现主键冲突错误的解决方法
mysql insert出现主键冲突错误的解决方法 insert 时防止出现主键冲突错误的方法 在mysql中插入数据的时候常常因为主键存在而冲突报错,下面有两个解决方法: 1 在insert 语句中添加ignore 关键字 insert ignore into table (id,name) values (1,username)…...
Visual Studio2022史诗级更新,增加多个提高生产力的功能
Visual Studio 2022发布了17.7x版,这次更新中,增加多个提高生产力的功能以及性能进一步改进。 如果要体验新功能,需要将Visual Studio 2022的版本升级到17.7及以上 下面我们看看新增的功能以及改进的功能! 目录 文件比较自动修复代…...
理解HTTPS/TLS/SSL(一)基础概念+配置本地自签名证书
文章目录 没有HTTPS时的样子场景模拟WireShark的Capture Filter和Display Filter设置Capture Filter启动程序设置Display Filter过滤抓到的包 结论 关于为什么加密更简洁有力的回答对称加密和非对称加密和CA证书密钥交换对称加密非对称加密CA机构和证书如何解决客户端和CA机构之…...
前端需要理解的Vue知识
1 模板语法 Vue使用基于 HTML 的模板语法,能声明式地将其组件实例的数据绑定到DOM。所有Vue 模板可以被符合规范的浏览器和 HTML 解析器解析。Vue 会将模板编译成高度优化的 JavaScript 代码。结合响应式系统,当应用状态变更时,Vue 能够智能…...
【Go 基础篇】Go语言中的自定义错误处理
错误是程序开发过程中不可避免的一部分,而Go语言以其简洁和高效的特性闻名。在Go中,自定义错误(Custom Errors)是一种强大的方式,可以为特定应用场景创建清晰的错误类型,以便更好地处理和调试问题。本文将详…...
LeetCode面试经典150题(day 1)
LeetCode是一个免费刷题的一个网站,想要通过笔试的小伙伴可以每天坚持刷两道算法题。 接下来,每天我将更新LeetCode面试经典150题的其中两道算法题,一边巩固自己,一遍希望能帮助到有需要的小伙伴。 88.合并两个有序数组 给你两个…...
嵌入式linux之QT交叉编译环境搭建(最简单实测通用版)
这里总结下用于嵌入式linux下的QT交叉编译环境搭建,留作备忘,分享给有需要的小伙伴。不管你的是什么嵌入式linux环境,实测过的通用方法总结。 环境准备 需要准备的环境要求如下: 1.虚拟机(vmvare15.5) 2.ubuntu18.04-x64的linu…...
线性代数的学习和整理14: 线性方程组求解
目录 1 线性方程组 2 有解,无解 3 解的个数 1 线性方程组 A*xy 3根直线的交点,就是解 无解的情况 无解: 三线平行无解:三线不相交 有解 有唯一解:三线相交于一点有无数解:三条线重叠 2 齐次线性方程组…...
Web Components详解-Custom Elements
目录 引言 演变过程 概述 使用方式 创建标签 定义标签 使用标签 获取标签 异步定义标签 升级标签 完整案例 结语 相关代码 参考文章 引言 随着项目体量的增大,组件化和模块化的优势也愈发明显了,构建可重复使用、独立、可互操作的组件变得…...
批量将excel文件按照分类生成多个excel文件
要批量将Excel文件按照分类生成多个Excel文件,文件名为分类名,可以使用Python中的pandas库来实现。下面是示例代码: import pandas as pd import os def split_excel_by_category(file_path, category_column, output_folder): # 读取Ex…...
PCL 点云组件聚类
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 该算法与欧式聚类、DBSCAN聚类很是类似,聚类过程如下所述: 1. 首先,我们需要提供一个种子点集合,对种子点集合进行初始的聚类操作,聚类的评估器(即聚类条件),可以指定为法向评估,也可以是距离评估,以此我…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
