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】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
 
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
 
【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...
