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.rhkb.cn/news/319973.html

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

相关文章

Centos上通过Docker安装ES管理端kibana

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Elasticsearch 是一…

《QT实用小工具·五十六》自适应界面变化的控件

1、概述 源码放在文章末尾 该项目实现了网格显示多张带文字的图片在界面中自适应布局 特点 跟随窗口大小变换位置,并带移动动画 响应鼠标事件,图片缩放动画 点击水波纹动画 项目demo演示如下所示: 项目部分代码如下所示: #i…

Electron+Vue3+Vite+ElectronForge整合 - 一键启动两个服务 一键打包两个服务

说明 本文介绍一下 Electron Vue3 Vite Electron Forge 的高级整合操作。vue3 : 使用 TS 的语法开发; Electron : 使用 JS 的语法开发。本文将从项目初始化开始,一步一步的完成项目的启动、打包全流程的介绍。实现的效果是 : 1、一个正常…

CRE-LLM:告别复杂特征工程,直接关系抽取

CRE-LLM:告别复杂特征工程,直接关系抽取 提出背景CRE-LLM 宏观分析CRE-LLM 微观分析1. 构建指令集(Instruction Design)2. 高效微调大型语言模型(Efficient Fine-Tuning on LLMs)3. 方法讨论(Di…

Leetcode—706. 设计哈希映射【简单】(constexpr)

2024每日刷题(127) Leetcode—706. 设计哈希映射 数组实现代码 class MyHashMap { public:MyHashMap() {memset(arr, -1, sizeof(arr));}void put(int key, int value) {arr[key] value;}int get(int key) {if(arr[key] -1) {return -1;} return arr…

【在线OJ】Vue在线OJ项目

一、主页 二、题库 三、在线编译器 四、比赛 五、搜索 六、个人主页

保研面试408复习 2——操作系统、计网

文章目录 1、操作系统一、进程、线程的概念以及区别?二、进程间的通信方式? 2、计算机网络一、香农准则二、协议的三要素1. 语法2. 语义3. 时序 标记文字记忆,加粗文字注意,普通文字理解。 1、操作系统 一、进程、线程的概念以及…

VMware worksation 17 简易安装Centos8.2、Redhat8.2、Ubuntu16.04

系列文章目录 文章目录 系列文章目录前言一、VMware worksation 17 安装二、安装Centos8.2三、安装RHEL8.2四、安装Ubuntu16.04总结 前言 傻瓜式按照Linux系统,如果觉得简单,可以自定义设置,特别是配置一下磁盘空间大小,对以后排…

深入解析:匹配网络(Matching Networks)的原理和应用

匹配网络(Matching Networks) 深入解析:匹配网络(Matching Networks)的原理和应用匹配网络的核心原理工作原理算法流程 匹配网络的实现应用示例结论 深入解析:匹配网络(Matching Networks&#…

使用docker-compose编排Lnmp(dockerfile) 完成Wordpress

目录 一、 Docker-Compose 1.1Docker-Compose介绍 1.2环境准备 1.2.1准备容器目录及相关文件 1.2.2关闭防火墙关闭防护 1.2.3下载centos:7镜像 1.3Docker-Compose 编排nginx 1.3.1切换工作目录 1.3.2编写 Dockerfile 文件 1.3.3修改nginx.conf配置文件 1.4Docker-Co…

leetCode74. 搜索二维矩阵

leetCode74. 搜索二维矩阵 二分法模板&#xff1a;见到背过就行 // 区间[L,R]被划分为[L,mid]和[mid 1, R]时使用这个模板 int bsearch_1(int l, int r){while(l < r){int mid l r >> 1;if(check(mid)) r mid; //check()判断mid是否满足性质else l mid 1;}retu…

Istio 流量管理(请求路由、流量转移、请求重试、流量镜像、故障注入、熔断等)介绍及使用

一、Istio 流量管理 Istio是一个开源的服务网格&#xff0c;它为分布式微服务架构提供了网络层的抽象。它使得服务之间的通信变得更为可靠、安全&#xff0c;并且提供了细粒度的流量管理、监控和策略实施功能。Istio通过在服务之间插入一个透明的代理&#xff08;Envoy&#x…

正则表达式_字符匹配/可选字符集

正则表达式&#xff08;Regular Expression&#xff09;也叫匹配模式(Pattern)&#xff0c;用来检验字符串是否满足特 定规则&#xff0c;或从字符串中捕获满足特定规则的子串。 字符匹配 最简单的正则表达式由“普通字符”和“通配符”组成。比如“Room\d\d\d”就这样 的正则…

有这样的黑色产业链你遇到了吗?

今天上午来到公司发现公司的数据库被黑了。还留下了勒索的信息&#xff0c;下面给大家粘贴上。现在这样的产业是不是很多。你怎么看 把公司的数据库全删除了。然后自己新建了一个数据库&#xff0c;又建立了一个表。里面写的内容如下。 omg! 肯定是扫描出来的。这个库对外暴…

ChatGPT Web Midjourney一键集成最新版

准备工具 服务器一台 推荐使用浪浪云服务器 稳定 安全 有保障 chatgpt api 推荐好用白嫖的api 项目演示 项目部署 浏览器访问casaos 添加软件原添加 https://gitee.com/langlangy_1/CasaOS-AppStore-LangLangy/raw/master/chatmjd.zip 安装此软件 等待安装 安装后再桌面设置…

【Python深度学习(第二版)(4)】神经网络的基本数据结构-张量概念、阶数、使用NumPy操作张量、张量种类、样本轴等概念

文章目录 一. 张量概念二. 张量的阶数1. 标量&#xff08;0阶张量&#xff09;2. 向量&#xff08;1阶张量&#xff09;2. 矩阵&#xff08;2阶张量&#xff09;3. 3阶张量与更高阶的张量 三. 张量属性及操作张量1. 张量的关键属性2. 在NumPy中操作张量2.1. 选择某个图片数据2.…

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持&#xff0c;我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具&#xff1a;Kaldi&#xff0c;Paddle&#xff0c;WeNet&#xff0c;EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具&#xff0c;由Daniel Pove…

上位机图像处理和嵌入式模块部署(树莓派4b使用lua)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 lua是一个脚本语言&#xff0c;比c语言开发容易&#xff0c;也没有python那么重&#xff0c;整体使用还是非常方便的。一般当成胶水语言进行开发&a…

对于子数组问题的动态规划

前言 先讲讲我对于这个问题的理解吧 当谈到解决子数组问题时&#xff0c;动态规划(DP)是一个强大的工具&#xff0c;它在处理各种算法挑战时发挥着重要作用。动态规划是一种思想&#xff0c;它通过将问题分解成更小的子问题并以一种递归的方式解决它们&#xff0c;然后利用这些…