面试:Spring(IOC、AOP、事务失效、循环引用、SpringMVC、SpringBoot的自动配置原理、Spring框架常见注解)

目录

一、Spring的单例Bean是否是线程安全的?

二、什么是AOP

1、介绍

(1)记录操作日志

(2)实现Spring中的事务

三、spring中事务失效的场景有哪些?

1、异常捕获处理

2、抛出检查异常

3、非public方法导致的事务失效

四、Spring的Bean的生命周期

五、Spring中的循环引用

1、一级缓存(singletonObjects)

2、二级缓存(earlySingletonObjects)

3、三级缓存(singletonFactories)

六、SpringMVC的执行流程

1、视图阶段(JSP)

2、前后端分离阶段(接口开发,异步请求)(重要)

七、SpringBoot的自动配置原理

八、Spring框架常见注解(Spring.Springboot、SpringMVC)

1、Spring常见的注解(容器的注解)

2、SpringMVC常见的注解(请求和响应的注解)

3、SpringBoot常见的注解(自动配置和启动类的注解)


一、Spring的单例Bean是否是线程安全的?

不是线程安全的

因为一般在spring的bean的中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决。


二、什么是AOP

1、介绍

AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

常见的AOP使用场景:

(1)记录操作日志

(2)实现Spring中的事务

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

  • 编程式事务控制:需使用TransactionTemplate来进行实现,对业务代码有侵入性,项目中很少使用。
  • 声明式事务管理:声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。


三、spring中事务失效的场景有哪些?

1、异常捕获处理

原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉。

解决方法:在catch块添加throw new RuntimeException(e)抛出

2、抛出检查异常

读取不存在的文件

原因:Spring 默认只会回滚非检查异常(RunTime异常)

解决:配置rollbackFor属性,@Transactional(rollbackFor=Exception.class)

3、非public方法导致的事务失效

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

解决方法:改为public方法。

四、Spring的Bean的生命周期

  1. 通过BeanDefinition获取bean的定义信息
  2. 调用构造函数初始化bean
  3. bean的依赖注入
  4. 处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)
  5. Bean的后置处理器BeanPostProcessor-前置
  6. 初始化方法(InitializingBean、init-method)
  7. Bean的后置处理器BeanPostProcessor-后置
  8. 销毁bean

五、Spring中的循环引用

如此一来会反复询问a、b对象是否存在,最后造成了死循环。

为了解决循环依赖的问题,spring提出了三级缓存。

1、一级缓存(singletonObjects)

作用:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象,限制bean在beanFactory中只存一份且必须走完整个生命周期,即实现singleton scope,解决不了循环依赖。

2、二级缓存(earlySingletonObjects)

作用:缓存早期的bean对象(生命周期还没走完)

在创建对象A时,会将半成品A存入二级缓存中,这样当B对象需要注入A时,就会拿出二级缓存中的A来创建对象,B对象创建成功后就会从二级缓存中删除,而后存入一级缓存中;同时A也会创建完毕,而后存入到一级缓存中;

3、三级缓存(singletonFactories)

作用:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

在实例化A时,会向三级缓存中存入一个对象工厂,在B对象需要注入A时,就会通过A的对象工厂生成A的代理对象并交由B注入,B创建成功后会存入一级缓存,并注入给A,让A创建一个代理对象并存入一级缓存中。


六、SpringMVC的执行流程

1、视图阶段(JSP)

2、前后端分离阶段(接口开发,异步请求)(重要)

  1. 用户发送出请求到前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping (处理器映射器)
  3. HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
  4. DispatcherServlet调用HandlerAdapter (处理器适配器)
  5. HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
  6. 方法上添加了@ResponseBody
  7. 通过HttpMessageConverter来返回结果转换为JSON并响应

七、SpringBoot的自动配置原理

1、在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

2、其中@EnableAutoConfiguration是实现自动化配置的核心注解。该注解通过@lmport注解导入对应的配置选择器。内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。

3、条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。


八、Spring框架常见注解(Spring.Springboot、SpringMVC)

1、Spring常见的注解(容器的注解)

2、SpringMVC常见的注解(请求和响应的注解)

3、SpringBoot常见的注解(自动配置和启动类的注解)

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

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

相关文章

香港Web3,步履蹒跚

4月30日,6支香港虚拟资产现货ETF在香港交易所敲钟上市,正式迎来市场首秀。 而在前一周,香港证监会(SFC)官网就已列出华夏基金(香港)、博时国际和嘉实国际三家基金公司的比特币和以太坊现货ETF,并陆续披露了…

[ log日志画图]分割模型训练结束生成相关日志运用代码画图

文章目录 [ log日志画图]分割模型训练结束生成相关日志运用代码画图我的log文件:画图:1.loss1.1 loss是干嘛的1.2 代码1.3 生成图 2.DICE.IOU2.1 DICE,IOU是干嘛的(常规介绍)2.2 代码2.3 生成图小白tip [ log日志画图]分割模型训练结束生成相关日志运用代…

python 怎么调用R

如何在python中调用R?这其中包括了如何调用R的对象(函数和包),R和python的对象如何互相转换,以及如何调用R的脚本(外界参数的输入)。python提供了一个模块rpy2,可以较好地完成这项工…

关于海康相机和镜头参数的记录

对比MV-CS020-10UC和大家用的最多的MV-CS016-10UC 其实前者适合雷达站使用,后者适合自瞄使用 一:MV-CS020-10UC的参数 二:对比 三:海康镜头选型工具

Java 基础重点知识-(泛型、反射、注解、IO)

文章目录 什么是泛型? 泛型有什么用?泛型原理是什么? Java 反射什么是反射? 反射作用是什么?动态代理有几种实现方式? 有什么特点? Java 注解什么是注解, 作用是什么? Java I/O什么是序列化?Java 是怎么实现系列化的?常见的序列化协议有哪些?BIO/NIO/AIO 有什么区别…

面试八股——HashMap

实现原理 红黑树是为了解决链表过长之后,查找时间过长的问题,将链表存储变为红黑树存储。 put方法的实现(5⭐) 相关属性: 1. 容量:初始容量为2^4。 2. 加载因子:初始值为0.75 上面两个属性的…

【面试经典 150 | 回溯】单词搜索

文章目录 写在前面Tag题目来源解题思路方法一:回溯 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾…

Cloudflare高级防御规则 看看我的网站如何用防御的

网站已趋于稳定,并且经过nginx调优。我想先分享一下Cloudflare的WAF规则,因为这是最有效的防御之一,可以抵御大量恶意攻击流量,我已经验证了数月。 对于海外独立站电商网站,Cloudflare的CDN服务是首选,它强…

1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍 每个激活函数的输入都是一个数字,然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素,如果不用激活函数的话,无论神经网络有多少层,输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性&am…

代谢组数据分析七:从质谱样本制备到MaxQuant搜库

前言 LC-MS/MS Liquid Chromatography-Mass Spectrometry(LC-MS/MS ,液相色谱-质谱串联)可用于残留化合物检测、有机小分子检测、鉴定和定量污染物以及在医药和食品领域添加剂检测和生物小分子等检测。 LC-MS/MS一般包含五个步骤&#xff…

50. 【Android教程】xml 数据解析

xml 是一种标记扩展语言(Extension Mark-up Language),学到这里大家对 xml 语言一定不陌生,但是它在 Android 中的运用其实只是冰山一角。抛开 Android,XML 也被广泛运用于各种数据结构中。在运用 xml 编写 Android 布…

HashMap的底层存储介绍

HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。对于我们一行理解很多技术都非常有帮助。 数据结构中由数组和链表来实现对数据的存储,他们各有特点。 (1)数组:占用空间连续。寻址容易,查询速…

openlayer 使用ol-ext插件实现凸显区域

使用ol-ext插件实现凸显多变形 效果如图 1、创建openlayer var map; var view; var tileLayer, source, vector;function init() {tileLayer new ol.layer.Tile({source: new ol.source.TileArcGISRest({url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStr…

Windows 10 使用 Vagrant 快速创建虚拟机

一、下载 VirtualBox 官网地址:Oracle VM VirtualBox 阿里云盘:阿里云盘分享 二、安装 VirtualBox 安装软件前请先确认 CPU 是否开启了虚拟化,要求开启 2.1、双击运行可执行文件后点击下一步 2.2、选择安装路径,为了避免中文乱码…

Rust Web开发实战:构建高效稳定的服务端应用

如果你厌倦了缓慢、占用大量资源且不稳定的模板化Web开发工具,Rust就是你的解决方案。Rust服务提供了稳定的安全保证、非凡的开发经验,以及能够自动防止常见错误的编译器。 《Rust Web开发》教你使用Rust以及重要的Rust库(如异步运行时的Tokio、用于Web…

OpenFeign修改HttpClient为Apache HttpClient 5

OpenFeign中http client 如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求, 由于默认HttpURLConnection没有连接池、性能和效率比较低。所以修改为Apache HttpClient 5。 总结为两步: 加依赖改yml 具体操作请往…

GORM数据库连接池对接Prometheus

一、背景与介绍 Golang的database/sql包定了关于操作数据库的相关接口,但是没有去做对应数据库的实现。这些实现是预留给开发者或者对应厂商进行实现的。 其中让我比较关注的是Golang的sql包有没有实现连接池pool的机制呢? 毕竟Golang是静态语言,类似J…

platformd device、driver注册过程

本文以smsc911x驱动为例 platform_device注册过程 该设备被定义在dts里面了 参考文章设备树节点转换为设备节点device_node、和平台设备资源platform_device_设备树节点转换成平台设备-CSDN博客 dts里面的节点会被转换为device_node和platform_device(并不是所有节点都会被转…

vi编辑器使用

说明:本文介绍vi编辑器使用; 介绍&基础使用 vi编辑器是linux操作系统中最常用的编辑器,使用vi或vim命令启动。vim是vi编辑器的增强版,大多数情况使用vi命令也会打开vim编辑器,为了方便介绍,以下均称v…

【Web】2024XYCTF题解(全)

目录 ezhttp ezmd5 warm up ezMake ez?Make εZ?мKε? 我是一个复读机 牢牢记住,逝者为大 ezRCE ezPOP ezSerialize ezClass pharme 连连看到底是连连什么看 ezLFI login give me flag baby_unserialize ezhttp 访问./robots.txt 继…