【java八股文】之Spring系列篇

1、你怎么理解Spring?

Spring是个轻量级的框架,简化了应用的开发程序,提高开发人员的系统维护性,不过配置消息比较繁琐,所以后面才出选了SpringBoot的框架。

Spring的核心组件 : Spring Core 、 Spring Context 、 Spring Beans

IOC是Bean的一个容器,Context是每个Bean之间依赖的关系。正是因为各种Bean建立的关系我们才构成了IOC容器为我们服务,而Core就是维护、建立和维护所需要的的工具。

2、Spring中的Bean 是线程安全的吗?

非安全的

  • 原型Bean

对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

  • 单例Bean

对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。

如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

 

但是如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。

  • 有状态就是有数据存储功能
  • 无状态就是不会保存数据 controller、service和dao层本身并不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。
  • 所以其实任何无状态单例都是线程安全的。


3、Spring单例,为什么controller、service和dao确能保证线程安全?


Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。

实际上大部分时间Bean是无状态的(比如Dao) 所以说在某种程度上来说Bean其实是安全的。

4、什么是IOC和AOP,你知道他们的原理吗?

IOC:IOC就是控制反转,是一种思想而不是技术实现,A类对象中需要B类对象,传统是自己手动new就是主动控制,IoC思想就是交给IoC容器管理,不再自己手动new,容器管理好对象以及依赖关系,需要的时候从容器里拿就行。

 

IOC原理:就是在给每一个bean进行实例化后,都要对他的属性进行填充,大多数我们都是使用@Autowire直接的填充依赖注入的,在实例化和实例化后之间会调用一个MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition一个寻找注入点的方法,然后在属性填充时候,首先是按照注入点的类型去寻找如果有多个选择@Qualifier注解寻找,如果还是有多个按照@Primary,@Priority,最后还是没有筛选出来一个唯一的注入就按照名字来查找。

 

AOP:是面向切面的编程,AOP就是可以将那些与业务不相关但是很多业务都要调用的代码抽取出来封装起来,减少重复代码,思想就是不侵入原有代码的情况下对功能进行增强。

 

AOP原理:SpringAOP是基于动态代理的,其中SpringAOP的底层的动态代理有两种方式,一种是对于实现接口的JDK Proxy方式,另外一种就是CgLib。

 

Aspect:表示切面,比如被@Aspect注解的类就是切面,可以在切面中去定义Pointcut、Advice等等。


Join point:表示连接点,表示一个程序在执行过程中的一个点,比如一个方法的执行,比如一个异常的处理,在Spring AOP中,一个连接点通常表示一个方法的执行。


Advice:表示通知,表示在一个特定连接点上所采取的动作。Advice分为不同的类型,后面详细讨论,在很多AOP框架中,包括Spring,会用Interceptor拦截器来实现Advice,并且在连接点周围维护一个Interceptor链。


Pointcut:表示切点,用来匹配一个或多个连接点,Advice与切点表达式是关联在一起的,Advice将会执行在和切点表达式所匹配的连接点上。


Introduction:可以使用@DeclareParents来给所匹配的类添加一个接口,并指定一个默认实现。


Target object:目标对象,被代理对象。


AOP proxy:表示代理工厂,用来创建代理对象的,在Spring Framework中,要么是JDK动态代理,要么是CGLIB代理。


Weaving:表示织入,表示创建代理对象的动作,这个动作可以发生在编译时期(比如Aspejctj),或者运行时,比如Spring AOP。

4、bean 的生命周期?

 

  • 首先通过扫描包路径,通过ASM技术获取到类的信息,封装成BeanDefintion注册到Spring容器当中(这个操作其实就是BeanFactory的后置处理器操作)
  • 然后就可以进行类的加载,进行类的实例化前操作、推断构造方法、实例化、实例化后、填充属性。(值得注意的是再实例化和实例化后之间有个BeanDefinction的后置处理器,这个后置处理器就是我们@Autowire的寻找注入点的迁前置操作。依赖注入就是再实例化后的操作)
  • 最后就进行执行Aware回调、初始化前、初始化、初始化后(代理逻辑)操作
  • 最后就是bean的销毁操作

5、Bean实例化的时候是如何解决循环依赖?

循环依赖就是在创建A实例的时候里面包含着B属性实例,所以这个时候就需要去创建B实例,而创建B实例过程中也包含着A实例。 这样A实例还在创建的过程当中,所以就导致A和B实例都创建不出来。

  • 一级缓存 就是我们所说的Bean存储的经过完整的生命周期的单例池
  • 二级缓存 缓存未经过完整的声明周期的Bean
  • 三级缓存 缓存的是ObjectFactory其实存储的是一个动态代理类的一个实现类的拉姆达表达式,执行这个拉姆达表达式就会生成这个类的代理类。

6、Bean实例化的三级缓存了解吗?

有了这三级缓存我们就来看一看,他是如何解决的。

如果出现了循环依赖的问题,我们在创建A的过程中,需要创建B。这个时候就需要将A放入三级缓存并且不会执行那个拉姆达表达式,所以这个时候需要去创建B在创建B时候需要去依赖A,就直接去三级缓存中查找,并且判断需不需要进行AOP处理,如果需要就执行那个拉姆达表达式得到代理对象,如果不需要就不需要执行,直接取出原始的对象。将取出的对象放入二级缓存中,因为这个时候A还未经过完整的生命周期所以不能放入一级缓存。这个时候其他需要依赖A对象的直接从二级缓存中去获取即可。当B创建完成,A继续执行生命周期,当A完成了属性的注入后,就可以放入一级缓存了。

7、SpringMVC的工作原理

  • 客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
  • DispatcherServlet 根据请求信息调用并且找到对应的HandlerMapping,解析请求对应的 Handler。
  • 然后利用对应的适配处理器,并且调用处理器开始执行,执行过程中包括解析参数,返回ModelAndView
  • Model 是返回的数据对象,View 是个逻辑上的 View
  • ViewResolver 会根据逻辑 View 查找实际的 View。
  • DispaterServlet 把返回的 Model 传给 View(视图渲染)。

8d84fc309f764a90b5463a529bd7cc36.png
8、Spring的事务实现方式?事务隔离级别?事务传播机制?

spring事务是在启动类上加一个@Configuration 和 @EnableTransactionManagement注解,然后再Service的方法上面加一个@Transactional注解就可以了。

Spring使用的事务隔离级别默认是使用MySQL数据库的隔离级别。

事务的传播机制:

 

8.1 当前不存在事务

  • requiresd 新建一个事务
  • requires_new 新建一个事务
  • nested 新建一个事务
  • mandatory 抛异常

 

8.2 当前存在事务

  • requiresd 加入这个事务
  • requires_new 把当前事务挂起,然后新建一个事务
  • nested 记录一个SavePoint,创建一个事务作为当前事务的嵌套事务来运行外部主事务回滚的话,子事务也会回滚,而内部子事务可以单独回滚而不影响外部主事务和其他子事务。
  • mandatory 加入该事务
  • never 以非事务方式运行,如果当前存在事务,则抛出异常。

9、讲一下SpringBoot里面比较常用的注解?

@configuration

@handmapping

@getmapping

@postmapping

@EnableTransactionManagement

@mapperScaner

@commpoent

@requestBody

@restcontroller

10、MyBatis的 # 和 $ 有什么区别?

  • ${}是properties文件的变量占位符,用于标签属性值和SQL内部,比如${driver}会被替换成com.mysql.jdbc.Driver。
  • #{}是SQL的参数占位符,实际上会被替换成 ?

11、SpringBoot 是如何实现自动装配的?


@SpringBootApplication下有三个注解:

  • @SpringBootConfiguration:启用 SpringBoot 的配置类,相当于是Spring中的一个配置文件,比如说可以在这个类去注册bean,或者导入其他的配置类
  • @ComponentScan:用于扫描启动类包下面的所有类的注解信息,并且注册
  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制,获取需要自动装配的所有配置类,读取所有的Start中的META-INF/spring.factories,按需加载到IOC容器中。

12、什么情况下会出现事务失效场景?

  • 数据库引擎不支持事务
  • 传播机制不支持事务,就是不以事务的情况运行
  • 没有配置事务管理器数据源
  • 没有被 Spring 管理
  • 方法不是 public 的 @Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。
  • 自身调用问题
  • 异常被捕获了
  • 异常的类型不匹配,默认是运行时的异常

 

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

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

相关文章

【Python数据可视化】matplotlib之设置子图:绘制子图、子图共享x轴坐标

文章传送门 Python 数据可视化matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

CDSP和CISP证书,选择哪个?

🎯CDSP和CISP是两种与信息安全领域相关的专业认证。它们有一些相似之处,但也存在一些显著的区别。本文将详细介绍CDSP认证和CISP认证的相同点和区别。 👑CDSP和CISP的相同点: 1.行业认可:CDSP和CISP都是行业广泛认可的…

机器视觉系统选型-参数—景深

镜头在垂直方向上,能清晰成像的空间距离(清晰成像范围),称为景深

强化学习应用(八):基于Q-learning算法的无人车配送路径规划(通过Python代码)

一、Q-learning算法介绍 Q-learning是一种强化学习算法,用于解决基于环境的决策问题。它通过学习一个Q-table来指导智能体在不同状态下采取最优动作。下面是Q-learning算法的基本步骤: 1. 定义环境:确定问题的状态和动作空间,并…

MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql

目录 打印MyBatis的日志配置: 灰度发布:指发布环境,比如发布环境有200台机器,发布的时候是一批一批的机器的发布 2.删除与修改 使用Results注解,这样就和上面的别名一个意思,column是数据库的列 自动转驼峰&#…

H5网站封装成App的高效转换之旅

在移动互联网时代,App(应用程序)和H5(HTML5网站)是两种常见的移动解决方案。App通常提供更流畅的用户体验和更丰富的功能,而H5网站则以其开发成本低、更新快捷和无需安装等优势受到青睐。尽管如此&#xff…

Apache-Common-Pool2中对象池的使用方式

最近在工作中,对几个产品的技术落地进行梳理。这个过程中发现一些朋友对如何使用Apache的对象池存在一些误解。所以在写作“业务抽象”专题的空闲时间里,本人觉得有必要做一个关于对象池的知识点和坑点讲解。Apache Common-Pool2 组件最重要的功能&#…

【快速解决】保姆级Anaconda安装教程

目录 第一步 ​编辑第二步 ​编辑第三步 第四步 第五步 第六步 ​编辑 第七步 第八步 第九步 第一步 在anaconda清华大学开源软件镜像站下载anaconda。点击这里进入 我这里选的是windows-x86_64。 第二步 下载好以后进行安装 第三步 第四步 第五步 选择…

【操作系统】在阅读论文:OrcFS: Orchestrated file system for flash storage时需要补充的基础知

在阅读论文:OrcFS: Orchestrated file system for flash storage是需要补充的基础知识 这篇论文是为了解决软件层次之间的信息冗余问题 To minimize the disk traffic, the file system buffers the updates and then flushes them to the disk as a single unit, …

通达信波动指数指标公式,识别盘整还是趋势

波动指数(Choppiness Index)是由澳大利亚商品交易员E.W. Dreiss开发的技术指标,用来判断市场是盘整还是趋势。该指标属于非方向性指标,不用于判断市场方向,而仅用于识别市场趋势。 指标的取值范围为0到100,数值越高,表…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-12+13 不变性原理+非线性系统稳定设计

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-1213 不变性原理非线性系统稳定设计 1. Invariance Princilpe-LaSalle;s Theorem不变性原理2. Nonlinear Basic Feedback Stabilization 非线性系统稳定设计 1. Invarianc…

Visual Studio Code1.67版本已正式发布,新增Rust指南

Visual Studio Code1.67版本已正式发布,该版本包含大量增强生产力的更新项: 资源管理器文件嵌套 通过这次更新,用于浏览和管理文件和文件夹的Visual Studio Code的资源管理器工具现在支持基于名称嵌套相关文件。 资源管理器现在支持根据文…

python学习笔记10(选择结构2、循环结构1)

(一)选择结构2 1、if……else……语句 #(1)基本格式 numbereval(input("请输入您的6位中奖号码:")) if number123456:print("恭喜您,中奖了") else:print("未中奖")#&…

JVM内存结构 vs. Java对象模型 vs. Java内存模型

文章目录 0.三者的区别1.JVM内存结构2.Java对象模型3.Java内存模型(JMM)3.1 为什么需要JMM3.2 JMM是规范3.3 JMM是工具类和关键字的原理3.4 最重要的三点内容 0.三者的区别 JVM内存结构:和Java虚拟机的运行时区域有关。 Java对象模型&#…

负荷预测 | Python基于CEEMDAN-VMD-BiGRU的短期电力负荷时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 提出一种分解去噪、重构分解的 CEEMDAN-VMD-BiGRU组合预测方法: 1 采用CEEMDAN将原始电力负荷数据分解成一组比较稳定的子序列,联合 小波阈值法将含有噪声的高频分量去噪,保留含有信…

竞赛练一练 第29期:GESP和电子学会相关题目练习

CIE一级2021.09_无奈的Jaime 小宝在房间吵闹,妈妈让Jaime想办法安抚小宝。Jaime在房间来回走动思考方法。最后也没想出方法只能摊开双手说 “sorry!”。 1. 准备工作 (1)添加背景:Bedroom 3; &#xff0…

[解决方案]运行时错误‘53’,文件未找到:MathPage.WLL

问题描述 mathtype使用报错,运行时错误‘53’,文件未找到:MathPage.WLL 解决方案 一、首先确定自己电脑的位数(这里默认大家的电脑都是64位) 二、右击MathType桌面图标,点击“打开文件所在位置”,然后找到MathPage.WLL文件所在位置 MathPage.WLL位置:D:\mathtype\…

Video接口介绍

屏库 https://m.panelook.cn/index_cn.php Open LDI, open lvds display interface OpenLDI and LVDS是兼容的, 是一种电平 https://www.ti2k.com/178597.html MIPI DSI/Camera crosLink FPD-LINK(Flat panel display link)是National(TI) LVDS技术, …

EI论文复现:考虑多能互补的综合能源系统/虚拟电厂/微电网优化运行程序代码!

本程序参考EI论文《基于多能互补的热电联供型微网优化运行》,文章通过储能设备解耦热电联系,建立基于多能互补的综合能源系统/虚拟电厂/微电网优化运行模型。模型包含系统供给侧的多能互补协调与需求侧的综合能源响应两个方面,使供给侧通过能…

Java内存模型之重排序

文章目录 1.什么是重排序2.重排序的好处3.重排序的三种情况4.用volatile修正重排序问题 1.什么是重排序 首先来看一个代码案例,尝试分析一下 x 和 y 的运行结果。 import java.util.concurrent.CountDownLatch;/*** 演示重排序的现象,直到达到某个条件…
最新文章