JAVA面试专题-框架篇(Spring+Mybatis)

Spring

Spring框架中的单例bean是线程安全的吗?

bean上面可以加入注解@Scope,如果是singleton(默认),意味着bean在每个spring IOC容器中只有一个实例;如果是prototype,说明一个bean定义可以有多个实例。spring框架没有对单例bean进行任何多线程的封装处理,关于单例bean的线程安全和并发安全需要开发者考虑

AOP

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

核心:使用aop中的环绕通知+切点表达式,通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等),获取到这些参数以后,保存到数据库。

Spring事务本质就是通过AOP功能,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交事务或者回滚。

Spring中事务失效的场景有哪些?

异常捕获处理:解决办法抛出异常
抛出检查异常(不是runtime):解决办法,在transactional中配置rollbackFor属性Exception
非public方法:改为public方法

Spring的Bean的生命周期

BeanDefinition:spring容器在进行实例化时,会将xml配置的bean的信息封装成一个BeanDefinition对象,根据这个对象来创建Bean对象,里面有很多属性描述Bean,如beanClassName:bean类名
initMethodName:初始化方法名
properryValues:bean的属性值
scope:作用域
lazyInit:延迟初始化

1. 通过BeanDefinition获取bean的定义信息
2. 调用构造函数实例化bean

3. bean的依赖注入
4. 处理Aware接口(BeanNameAware,BeanFactoryAware,ApplicationContextAware)
5. bean的后置处理器BeanPostProcessor-前置
6. 初始化方法(InitializingBean,init_method)
7. bean的后置处理器BeanPostProcessor-前置(AOP,动态代理等)
8. bean销毁destory

Spring中的循环引用

Spring的循环依赖

 三级缓存

一级缓存:singletonObjects:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象。
二级缓存:earlySingletonObjects:缓存早起的bean对象(生命周期还没走完)。
三级缓存:singletonFactories:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的。

一级缓存作用:限制bean在beanFactory中只存一份,即实现singleton scope,解决不了循环依赖。
实例化A,先在堆内开辟内存空间得到半成品A,看到了b要设置b属性,因为b是B类型的对象,需要到spring容器查找对象,由于没有B,所以实例化B,在堆内开辟空间得到半成品B,之后初始化B,设置a属性后需要初始化A,造成循环。

 二级缓存:做中间人

实例化A后得到原始对象A以后放入到二级缓存中(半成品),此时需要注入B,所以实例化B,得到一个原始对象B也放入到二级缓存中,此时需要注入A,从二级缓存中即可获取A,B创建成功注入给A,A也创建成功,放入到一级缓存中。

 三级缓存:代理对象

实例化A,原始对象A生成一个ObjetFactory对象放入到三级缓存中,此时需要注入B所以进行实例化,生成一个objectfactory的b对象放入三级缓存,需要注入A,之后从三级缓存中拿到A的objectfactory对象创建代理对象放到二级缓存中,同时注入给B,后面一致。

 如果构造方法中产生了循环依赖,由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的依赖注入。在后面加入@Lazy注解进行懒加载,什么时候需要对象再进行bean对象的创建。

SpringMVC的执行流程

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

SpringBoot自动配置原理

@SpringBootApplication=
@SpringBootConfiguration:声明当前类是一个配置类
@ComponentScan:组件扫描当前引导类所在包及其子包
@EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解

 其通过@Import注解注入导入对应的配置选择器,读取该项目和该项目引用的jar包的classpath路径下META-INF/spring.factories文件中的所配置类的全类名,在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类所有的Bean放入spring容器中使用。

Spring常见注解

 

Mybatis

Mybatis执行流程

1. 读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件
2. 构建会话工厂SqlSessionFactory
3. 会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)
4. 操作数据库接口,Executor执行器,同事负责查询缓存的维护
5. Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息
6. 输入参数映射:从java类型到sql类型
7. 输出结果映射:从sql转为jave类型

Mybatis延迟加载

查询用户的时候,把用户所属的订单数据也查询出来,这个是立即加载
查询用户的时候,暂时不查询订单数据,当需要订单的时候,再查询订单,这个就是延迟加载

延迟加载原理:

1. 使用CGLIB创建目标对象的代理对象
2. 当调用目标方法时,进入拦截器的invoke方法,发现目标方法是null,执行sql查询
3. 获取数据后,调用set方法设置属性值,再继续查询方法,就有值了

Mybatis一级二级缓存

一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或者close后,Cache清空,默认打开一级缓存
二级缓存;基于namespace和mapper的作用域起作用,不依赖session,默认也是采用perpetualcache,hashmap存储,需要单独开启,一个是核心配置,一个是mapper映射文件

二级缓存清理数据:当某个作用域(一级缓存session/二级缓存namespace)进行了增删改后,默认该作用域所有select中的缓存被clear。

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

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

相关文章

nginx--配置文件

组成 主配置文件:nginx.conf 子配置文件:include conf.d/*.conf 协议相关的配置文件:fastcgi uwsgi scgi等 mime.types:⽀持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联⽹网邮件扩展类型&…

NASA数据集——NASA 标准二级(L2)暗目标(DT)气溶胶产品每 6 分钟在全球范围内对陆地和海洋上空的气溶胶光学厚度(AOT)产品

VIIRS/NOAA20 Dark Target Aerosol 6-Min L2 Swath 6 km 简介 NOAA-20(前身为联合极地卫星系统-1(JPSS-1))--可见红外成像辐射计套件(VIIRS)NASA 标准二级(L2)暗目标(D…

NASA数据集——VIIRS每日 L3深蓝气溶胶网格产品(AERDB_D3_VIIRS_SNPP),以 1 x 1 度

VIIRS/SNPP Deep Blue Level 3 monthly aerosol data, 1 degree x1 degree grid 简介 美国国家航空航天局(NASA)的可见红外成像辐射计套件(VIIRS)标准三级(L3)每月深蓝气溶胶产品来自苏米国家极轨伙伴关系…

机器学习:基于Sklearn、XGBoost,使用逻辑回归、支持向量机和XGBClassifier预测股票价格

前言 系列专栏:机器学习:高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学…

推开通用人工智能大门,多模态大模型是新一代人工智能技术范式

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

C——双向链表

一.链表的概念及结构 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么意思呢?意思就是链表在物理结构上不一定是连续的,但在逻辑结构上一定是连续的。链表是由一个一个的节点连…

【15】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

windows 驱动开发-DMA技术(三)

在早期,是按照基于包或者基于流的方式来描述DMA的,不过这个描述可能不准确,故在Vista之后修改为使用数据包/使用公共缓冲区的系统DMA。 简单的解释一下基于包和基于流的说法的原因,数据包是指一个个基于一定大小的数据块&#xf…

IDA pro动态调试so层初级教程

一、开启服务 adb push D:\MyApp\IDA_Pro_7.7\dbgsrv\android_server64 /data/local/tmpadb shell cd /data/local/tmp chmod 777 android_server64 ./android_server64二、IDA附加进程 十万个注意:IDA打开的so文件路径不能有中文 手机打开要调试的app 附加成功

讯飞星火大模型赋能教育,引领教育实现数字化转型 | 最新快讯

(原标题:讯飞星火大模型赋能教育,引领教育实现数字化转型) 随着人工智能的发展,大模型正成为人们获取知识、学习知识的“超级助手”,是解放生产力、释放想象力的“好帮手”。随着大模型在多个领域大放异彩…

guidance - Microsoft 推出的编程范式

文章目录 一、关于 guidance安装 二、加载模型llama.cppTransformersVertex AIOpenAI 三、基本生成四、限制的生成选择(基本)正则表达正则表达式来限制生成正则表达式作为停止标准 上下文无关语法 五、状态控制生成1、不可变对象中的状态2、有状态的 gui…

Nodejs 第六十九章(杀毒)

杀毒 杀毒(Antivirus)是指一类计算机安全软件,旨在检测、阻止和清除计算机系统中的恶意软件,如病毒、蠕虫、木马、间谍软件和广告软件等。这些恶意软件可能会对计算机系统和用户数据造成损害,包括数据丢失、系统崩溃、…

基于ROS从零开始构建自主移动机器人:仿真和硬件

书籍:Build Autonomous Mobile Robot from Scratch using ROS:Simulation and Hardware 作者:Rajesh Subramanian 出版:Apress 书籍下载-《基于ROS从零开始构建自主移动机器人:仿真和硬件》您将开始理解自主机器人发…

(1)从头搞懂 Transformer模型(图解)

1、Transformer简介 GPT回答:(面试被问到可以这么介绍) Transformer是一种用于处理序列数据的深度学习模型架构,最初由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它在处理序列到序列(seq2seq&…

2024年Q1葡萄酒行业线上电商(京东天猫淘宝)销售排行榜

五一聚餐不可缺少饮品——葡萄酒。鲸参谋监测的线上电商平台(某东)Q1季度葡萄酒行业销售数据已揭晓! 从鲸参谋的数据中,我们可以明显看到今年Q1季度在线上电商平台(某东)葡萄酒行业的销售情况呈现出积极的…

Java面试八股之int和Integer有什么区别

int和Integer有什么区别 基本类型与包装类: int:int是Java中的一个基本数据类型(primitive type),用于表示整数。它直接存储数值,没有独立的对象实例,不涉及内存管理。 Integer:I…

WebGL渲染引擎优化方向 -- 加载性能优化

作者:caven chen 前言 WebGL 是一种强大的图形渲染技术,可以在浏览器中快速渲染复杂的 3D 场景。但是,由于 WebGL 的高性能和高质量要求,如果不注意性能优化,它可能会消耗大量的 CPU 和 GPU 资源,导致应用…

使用 VLC Media Player 播放 RTSP 流媒体

VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议,也可以播放 RTSP 流媒体。 一、简介: VLC Media Player 是一款功能强大且开源的跨平台多媒体播放器。 支持…

LeetCode 102.对称二叉树

题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false提示: 树中节点数…

【免费Java系列】大家好 ,给大家出一些今天学习内容的案例点赞收藏关注,持续更新作品 !

多态 Java中的多态是指同一个方法在不同的对象上有不同的行为: 案例一 以下有四个类 : 动物类与狗、猫类 Test测试类 // 动物类 class Animal {public void sound() {System.out.println("动物发出声音");} }// 狗类 class Dog extends Animal {Overridepublic void…