Spring-Mybatis框架常见面试题

server/2025/3/25 21:28:00/

1、介绍下什么是Spring框架的IOC和DI

IOC 控制反转,指将对象的创建权,反转到Spring容器;

DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入,不能单独存在,需要在IOC的基础上完成操作,通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

2、Spring里面 bean的scope作用域有哪些

singleton:单例, 默认值,调用getBean方法返回是同一个对象,实例会被缓存起来,效率比较高,当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。

prototype: 多例,调用getBean方法创建不同的对象,会频繁的创建和销毁对象造成很大的开销。

request :每个Http请求都会创建一个新的bean。

session: 每个Http Session请求都会创建一个新的bean。

3、什么是AOP以及好处

AOP 面向切面编程, 在不改变原有逻辑上增加额外的功能。

AOP思想把功能分两个部分:核心关注点(业务的主要功能)和横切关注点(非核心、额外增加的功能)。

比如以用户下单为例子:核心关注点是创建订单,横切关注点:记录日志、控制事务。

AOP 面向切面编程的好处:解耦;减少代码重复,可以统一处理横切逻辑。

4、解释下AOP里面常见的概念,比如 横切、通知、连接点、切入点、切面 、目标、织入

横切关注点:对哪些方法进行拦截,拦截后怎么处理,比如 权限认证、日志、事物;

通知:在特定的切入点上执行的增强处理,有5种通知(什么时间点、做什么事情);

连接点:要用通知的地方,全部方法都可以是连接点;

切入点:不能全部方法都是连接点,通过通配、正则表达式过滤出特定的一组 JointPoint连接点来进行通知;

切面:通常是一个类,里面定义 切入点(定义在什么地方)+通知(什么时间点、做什么事情);

目标:目标类,真正的业务逻辑,可以在目标类不知情的条件下,增加新的功能到目标类的链路上;

织入:把切面应用到目标函数的过程称为织入。

5、说下JDBC连接数据库的步骤

(1)加载数据库驱动

(2)获取数据连接对象

(3)获取语句对象,会话对象有两种Statement和PreparedStatement执行语句,     PreparedStatement在执行之前会进行预编译,能够有效防止SQL注入;PreparedStatement支   持?占位符而不是直接拼接

(4)处理结果集

(5)关闭连接资源,关闭顺序:rs.close()、st.close()、conn.close() 

6、说下Mybatis加载的流程

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心,SqlSessionFactory 的实例是通过 SqlSessionFactoryBuilder 从 XML 配置文件来构建出来的,SqlSessionFactory可以创建 SqlSession,SqlSession提供了执行 SQL 的方法,接着Executor负责执行SQL 语句。

7、#{ } 和 ${}的区别是什么

#{ }是预编译处理,${}是字符串替换;

mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

mybatis在处理${}时,会把${}替换成变量的值。

使用#{}可以有效的防止SQL注入。

8、介绍下Mybatis一级缓存跟Mybatis二级缓存

(1)、一级缓存的作用域是SqlSession,同一个SqlSession中执行相同的SQL查询(相同的SQL和参数),第一次会去查询数据库并写在缓存中,第二次会直接从缓存中取,默认开启一级缓存

失效策略:当执行SQL时候两次查询中间发生了增删改的操作,即insert、update、delete等操作commit后会清空该SQLSession缓存; 比如sqlsession关闭,或者清空等。

(2)、二级缓存是namespace级别的,多个SqlSession去操作同一个namespace下的Mapper的sql语句,多个SqlSession可以共用二级缓存;默认是没有开启二级缓存,为了使用二级缓存,需要手动配置并在对应的 Mapper XML 文件中启用它。

操作流程:第一次调用某个namespace下的SQL去查询信息,查询到的信息会存放该mapper对应的二级缓存区域。第二次调用同个namespace下的mapper映射文件中,相同的sql去查询信息,会去对应的二级缓存内取结果。

失效策略:执行同个namespace下的mapepr映射文件中增删改sql,并执行了commit操作,会清空该二级缓存。

注意:

实现二级缓存的时候,MyBatis建议返回的POJO是可序列化的, 也就是建议实现Serializable接口。

若一级缓存和二级缓存同时启用,优先查询二级缓存->查询一级缓存->数据库。


http://www.ppmy.cn/server/179064.html

相关文章

linux更换镜像源[CentOs]

问题:在使用linux的yum命令时常常会遇到由于无法加载到centos官方镜像源的问题,报错信息如图所示 解决方法:更换国内的数据源 1. 备份原有仓库配置 sudo cp -r /etc/yum.repos.d/ /etc/yum.repos.d.backup # 备份整个目录 sudo rm -rf /et…

SciPy常见面试题及解析

文章目录 1. SciPy与NumPy的区别是什么?2. 如何使用SciPy求解方程 x 2 + 2 x + 1 = 0 x^2 + 2x + 1 = 0 x2+2x+1=0 的根?3. SciPy中如何计算定积分 ∫ 0 π sin ⁡ ( x ) d x \int_{0}^{\pi} \sin(x) dx ∫0π​sin(x)dx?4. 如何用SciPy实现最小二乘法拟合数据?5. SciPy的…

Lua语言的配置管理

Lua语言的配置管理 引言 在软件开发中,配置管理是一个不可或缺的环节,它直接影响到软件的灵活性、可维护性和扩展性。Lua作为一种轻量级、可嵌入的脚本语言,因其简洁和高效而受到广泛欢迎。本文将深入探讨如何使用Lua进行配置管理&#xff…

VitePress由 Vite 和 Vue 驱动的静态站点生成器

vitepress官网:VitePress | 由 Vite 和 Vue 驱动的静态站点生成器 将 Markdown 变成优雅的文档,只需几分钟,起初是想给我的开源项目PakePlus做一个使用说明的文档和官网的,然后就无意间了解到这个vitepress了,这个是v…

SpringMVC 跨域问题两种常用解决方案

如今前后端分离的架构模式日益普及的模式下,前端和后端往往部署在不同的域名或端口下,这就不可避免地会遇到跨域问题。本文将详细介绍SpringMVC其中两种常见且有效的解决方案。 本文目录 一、跨域简介二、为什么要解决跨域问题三、使用CrossOrigin注解1.…

技术速递|.NET AI 模板现已提供预览版

作者:Jordan Matthiesen 排版:Alan Wang 想要开始 AI 开发,却不确定从哪里入手?我给您带来了一个好消息——我们全新的 AI 聊天 Web 应用模板现已提供预览版!😊 这个模板是我们持续努力的一部分成果&#x…

微服务分层架构详解:表示层、应用层与基础设施层的协同工作

微服务分层架构详解:表示层、应用层与基础设施层的协同工作 文章目录 微服务分层架构详解:表示层、应用层与基础设施层的协同工作1. 表示层(Presentation Layer)1.1 表示层的作用1.2 技术选型1.3 表示层的挑战 2. 应用层&#xff…

人工智能时代大学教育范式重构:基于AI编程思维的能力培养路径研究

人工智能技术的快速发展正在重塑高等教育的内容与方法。本文以AI编程教育为切入点,通过文献分析与案例研究,探讨AI时代大学教育的核心能力需求与教学范式转型路径。研究发现,AI编程中蕴含的系统性思维训练、项目架构能力和元认知能力培养机制…