【Java 面试 八股文】框架篇
框架篇
- 1. Spring框架中的单例bean是线程安全的吗?
- 2. 什么是AOP?
- 3. 你们项目中有没有使用到AOP?
- 4. Spring中的事务是如何实现的?
- 5. Spring中事务失效的场景有哪些?
- 6. Spring的bean的生命周期?
- 7. Spring中的循环引用?
- 8. 那具体解决流程清楚吗?
- 9. 构造方法出现了循环依赖怎么解决?
- 10. SpringMVC的执行流程?
- 11. Springboot自动配置原理?
- 12. Spring 的常见注解有哪些?
- 13. SpringMVC常见的注解有哪些?
- 14. Springboot常见注解有哪些?
- 15. MyBatis执行流程?
- 16. Mybatis是否支持延迟加载?
- 17. 延迟加载的底层原理知道吗?
- 18. Mybatis的一级、二级缓存用过吗?
- 19. Mybatis的二级缓存什么时候会清理缓存中的数据?
1. Spring框架中的单例bean是线程安全的吗?
Spring 中的 Bean 默认都是单例的。
候选人:
不是线程安全的。当多用户同时请求一个服务时,容器会给每个请求分配一个线程,这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改,比如修改单例的成员属性,就必须考虑线程同步问题。Spring框架本身并不对单例bean进行线程安全封装,线程安全和并发问题需要开发者自行处理。
通常在项目中使用的Spring bean是不可变状态(如Service类和DAO类),因此在某种程度上可以说Spring的单例bean是线程安全的。如果bean有多种状态(如ViewModel对象),就需要自行保证线程安全。最简单的解决办法是将单例bean的作用域由“singleton”变更为“prototype”。
2. 什么是AOP?
候选人:
AOP,即面向切面编程,在Spring中用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑抽取出来,实现公共模块复用,降低耦合。常见的应用场景包括公共日志保存和事务处理。
3. 你们项目中有没有使用到AOP?
候选人:
我们之前在后台管理系统中使用AOP来记录系统操作日志。主要思路是使用AOP的环绕通知和切点表达式,找到需要记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,例如类信息、方法信息、注解、请求方式等,并将这些参数保存到数据库。
4. Spring中的事务是如何实现的?
候选人:
声明式事务。
Spring实现事务的本质是利用AOP完成的。它对方法前后进行拦截,在执行方法前开启事务,在执行完目标方法后根据执行情况提交或回滚事务。
5. Spring中事务失效的场景有哪些?
候选人:
事务管理在Spring Boot中通常是通过 @Transactional 注解来实现的。
- 如果方法内部捕获并处理了异常,没有将异常抛出,会导致事务失效。因此,处理异常后应该确保异常能够被抛出。
- 如果方法 抛出检查型异常(checked exception),并且没有在@Transactional注解上配置rollbackFor属性为Exception,那么异常发生时事务可能不会回滚。(原因:Spring 默认只会回滚非检查异常)
- 如果 事务注解的方法不是公开(public)修饰的,也可能导致事务失效。
6. Spring的bean的生命周期?
候选人:
Spring中bean的生命周期包括以下步骤:
- 通过
BeanDefinition获取bean的定义信息。 - 调用 构造函数 实例化bean。
- 进行bean的 依赖注入,例如通过setter方法或@Autowired注解。
- 处理实现了 Aware接口 的bean。
- 执行
BeanPostProcessor的 前置处理器。 - 调用 初始化方法,如实现了
InitializingBean接口或自定义的init-method。 - 执行
BeanPostProcessor的 后置处理器,可能在这里产生代理对象。 - 最后是 销毁bean。

7. Spring中的循环引用?
候选人:
循环依赖发生在两个或两个以上的bean互相持有对方,形成闭环。 Spring框架允许循环依赖存在,并通过三级缓存解决大部分循环依赖问题(set 方法形成的循环依赖):
- 一级缓存
singletonObjects:单例池,缓存已完成初始化的bean对象(已经经历了完整的生命周期)。 - 二级缓存
earlySingletonObects:缓存尚未完成生命周期的早期bean对象。 - 三级缓存
singletonFactories:缓存ObjectFactory(对象工厂),用于创建bean对象。

8. 那具体解决流程清楚吗?
- 实例化A对象,并创建
ObjectFactory存入三级缓存。 - A在初始化时需要B对象,开始B的创建逻辑。
- B实例化完成,也创建
ObjectFactory存入三级缓存。 - B需要注入A,通过三级缓存获取
ObjectFactory生成A对象,存入二级缓存。 - B通过二级缓存获得A对象后,B创建成功,存入一级缓存。
- A对象初始化时,由于B已创建完成,可以直接注入B,A创建成功存入一级缓存。
- 清除二级缓存中的临时对象A。
9. 构造方法出现了循环依赖怎么解决?
候选人:
三级缓存能够解决初始化过程中的循环依赖,不能解决构造函数中的循环依赖。
原因:由于构造函数是bean生命周期中最先执行的,Spring框架无法解决构造方法的循环依赖问题。
解决:可以使用 @Lazy 懒加载注解,延迟bean的创建直到实际需要时。
10. SpringMVC的执行流程?
HandlerMapping:
- 作用:HandlerMapping 负责将请求映射到处理器(Controller)。
- 功能:根据请求的 URL、请求参数等信息,找到处理请求的 Controller。
HandlerAdapter:
- 作用:HandlerAdapter 负责调用处理器(Controller)来处理请求。
- 功能:Controller 可能有不同的接口类型,HandlerAdapter 根据处理器的类型来选择合适的方法来调用处理器。
SpringMVC的执行流程包括以下步骤(版本1:视图版本,jsp):
- 用户发送请求到 前端控制器
DispatcherServlet(调度中心)。 - DispatcherServlet调用 处理器映射器
HandlerMapping找到具体处理器。 - HandlerMapping返回处理器对象及拦截器(如果有)给DispatcherServlet。
- DispatcherServlet调用 处理器适配器
HandlerAdapter。 - HandlerAdapter适配并调用 具体处理器
Handler/Controller。 - Controller执行并返回
ModelAndView对象。 - HandlerAdapter将ModelAndView返回给DispatcherServlet。
- DispatcherServlet传给 视图解析器
ViewResolver进行视图解析。 - ViewResolver返回具体 视图
View给DispatcherServlet。 - DispatcherServlet渲染视图并响应用户。

SpringMVC的执行流程包括以下步骤(版本 2:前后端开发,接口开发):
- 用户发送请求到 前端控制器
DispatcherServlet(调度中心)。 - DispatcherServlet调用 处理器映射器
HandlerMapping找到具体处理器。 - HandlerMapping返回处理器对象及拦截器(如果有)给DispatcherServlet。
- DispatcherServlet调用 处理器适配器
HandlerAdapter。 - HandlerAdapter适配并调用 具体处理器
Handler/Controller。 - 方法上添加了
@ResponseBody。 - 通过
HttpMessageConverter来返回结果转换为JSON并响应。

11. Springboot自动配置原理?
候选人:
Spring Boot的自动配置原理基于 @SpringBootApplication 注解,它封装了 @SpringBootConfiguration、 @EnableAutoConfiguration 和 @ComponentScan。
@EnableAutoConfiguration 是实现自动化配置的核心注解,它通过 @Import 导入配置选择器,读取该项目和该项目引用的Jar包的 classpath 路径下 META-INF/spring.factories 文件中的类名,根据 条件注解所指定的条件 决定是否将配置类中的Bean导入到Spring容器中。
条件判断会有像 ConditionalOnClass 这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中。

12. Spring 的常见注解有哪些?
候选人:
Spring的常见注解包括:
- 声明Bean的注解:@Component、@Service、@Repository、@Controller。
- 依赖注入相关注解:@Autowired、@Qualifier、@Resource。
- 设置作用域的注解:@Scope。
- 配置相关注解:@Configuration、@ComponentScan、@Bean。
- AOP相关注解:@Aspect、@Before、@After、@Around、@Pointcut。

13. SpringMVC常见的注解有哪些?
候选人:
SpringMVC的常见注解有:
- @RequestMapping:映射请求路径。
- @RequestBody:接收HTTP请求的JSON数据。
- @RequestParam:指定请求参数名称。
- @PathVariable:从请求路径中获取参数。
- @ResponseBody:将Controller方法返回的对象转化为JSON。
- @RequestHeader:获取请求头数据。

14. Springboot常见注解有哪些?
候选人:
Spring Boot的常见注解包括:
- @SpringBootApplication:由@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan组成。
- 其他注解如@RestController、@GetMapping、@PostMapping等,用于简化Spring MVC的配置。

15. MyBatis执行流程?
MyBatis的执行流程如下:
- 读取MyBatis配置文件
mybatis-config.xml(加载运行环境和映射文件)。 - 构造会话工厂
SqlSessionFactory。 - 会话工厂创建
SqlSession对象(包含了执行SQL语句的所有方法)。 - 操作数据库的接口,
Executor执行器。 Executor执行方法中的MappedStatement参数(封装了映射信息)。- 输入参数映射。
- 输出结果映射。
16. Mybatis是否支持延迟加载?
候选人:
MyBatis支持延迟加载,即在需要用到数据时才加载。可以通过配置文件中的lazyLoadingEnabled配置启用或禁用延迟加载。
17. 延迟加载的底层原理知道吗?
候选人:
延迟加载的底层原理主要使用CGLIB动态代理实现:
- 使用CGLIB创建目标对象的代理对象。
- 调用目标方法时,如果发现是null值,则执行SQL查询。
- 获取数据后,设置属性值并继续查询目标方法。
18. Mybatis的一级、二级缓存用过吗?
候选人:
MyBatis的一级缓存是基于PerpetualCache的HashMap本地缓存,作用域为Session,默认开启。二级缓存需要单独开启,作用域为Namespace或mapper,默认也是采用PerpetualCache,HashMap存储。
19. Mybatis的二级缓存什么时候会清理缓存中的数据?
候选人:
当作用域(一级缓存Session/二级缓存Namespaces)进行了新增、修改、删除操作后,默认该作用域下所有select中的缓存将被清空。
相关文章:
【Java 面试 八股文】框架篇
框架篇 1. Spring框架中的单例bean是线程安全的吗?2. 什么是AOP?3. 你们项目中有没有使用到AOP?4. Spring中的事务是如何实现的?5. Spring中事务失效的场景有哪些?6. Spring的bean的生命周期?7. Spring中的…...
原型模式详解(Java)
原型模式(Prototype Pattern),作为一种极具代表性的创建型设计模式,其核心思想在于通过复制,亦即克隆现有的对象,来达成创建新对象的目的,而非依赖传统的构造函数途径。这一模式巧妙地基于现有对…...
TCP拥塞控制机制
TCP拥塞控制机制是TCP协议中至关重要的一部分,用于防止网络出现拥塞,保证网络的高效、稳定运行 拥塞控制的基本概念 拥塞:在计算机网络中,拥塞是指当网络中存在过多的分组时,网络性能下降的现象,如延迟增…...
自动化UI测试 | 什么是测试驱动开发(TDD)和行为驱动开发(BDD)?有何区别?
TDD(测试驱动开发)和BDD(行为驱动开发)是两种独特的软件开发技术,它们在测试的内容和方式上有所不同。尽管名称相似,但服务于不同的目的。 什么是TDD? TDD代表测试驱动开发。它是一个过程&…...
DeepSeek 助力 Vue 开发:打造丝滑的进度条
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
一场始于 Selector Error 的拯救行动:企查查数据采集故障排查记
时间轴呈现事故进程 17:00:开发人员小李正在尝试利用 Python 爬虫从企查查(https://www.qcc.com)抓取公司工商信息。原本一切正常,但突然发现信息采集失败,程序抛出大量选择器错误。17:15:小李发现&#x…...
微信服务号推送消息
这里如果 没有 就需要点新的功能去申请一下 申请成功之后就可以设置模版消息 推送到用户接受的页面是 需要后端调用接口 传递token 发送给客户...
24电子信息类研究生复试面试问题汇总 电子信息类专业知识问题最全!电子信息复试全流程攻略 电子信息考研复试真题汇总
你是不是在为电子信息考研复试焦虑?害怕被老师问到刁钻问题、担心专业面答不上来?别慌!作为复试面试92分逆袭上岸的学姐,今天手把手教你拆解电子信息类复试通关密码!看完这篇,让你面试现场直接开大…...
嵌入式EasyRTC实时通话支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc
EasyRTC已经完美支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc,总体SDK大小控制在680K以内(预计还能压缩100K上下): EasyRTC在hi3516cv610芯片上能双向通话、发送文字以及二进制指令,总体运行…...
如何搭建Wi-Fi CVE漏洞测试环境:详细步骤与设备配置
引言 随着Wi-Fi技术的普及,Wi-Fi网络成为了现代通信的重要组成部分。然而,Wi-Fi网络的安全性始终是一个备受关注的话题。通过漏洞扫描和安全测试,网络管理员可以及早发现并修复Wi-Fi设备中存在的安全隐患。本篇文章将详细介绍如何搭建Wi-Fi …...
sqlalchemy 使用fetchmany 报错 KeyError 或 AttributeError
问题 我遇到的问题是 AttributeError: Could not locate column in row for column xxxx 解决 首先看你定义的模型类是否缺失了相关的字段 Column XXX not found._clould not locate column in row for column-CSDN博客 其次 rows result.fetchmany(1000) for (row,) i…...
计算机视觉中图像的基础认知
一、图像/视频的基本属性 在计算机视觉中,图像和视频的本质是多维数值矩阵。图像或视频数据的一些基本属性。 宽度(W) 和 高度(H) 定义了图像的像素分辨率,单位通常是像素。例如,一张 1920x10…...
Docker Desktop WebAPI《1》
方法1 》》生成 的文档不要动, 》》执行 Container(Dockerfile) 会生成镜像文件和容器 》》生成的镜像和容器 在 Docker Desktop 中可以查看 用VS 的 Container Dockerfile 调试 但把这个调试工工具 停止,WebAPi就不能访问了 …...
ELK安装部署同步mysql数据
ELK 安装部署指南 ELK 是 Elasticsearch、Logstash 和 Kibana 的简称,用于日志收集、存储、分析和可视化。 1. 安装 Elasticsearch Elasticsearch 是一个分布式搜索和分析引擎。 1.1 下载并安装 访问 Elasticsearch 官网 下载最新版本。 解压并安装: tar…...
《OpenCV》——特征提取与匹配方法
特征提取 特征提取是从原始数据中提取出能够代表数据本质特征和关键信息的过程,在很多领域都有广泛应用。原始数据往往包含大量的冗余信息,特征提取的目的是去除这些冗余,提取出最具代表性、最能区分不同类别或模式的特征,从而降…...
Oracle DBA 诊断及统计工具-2
Oracle 数据表空间和索引表空间的资源分配比例总结 在 Oracle 数据库中,数据表空间和索引表空间并没有固定的资源分配比例,其分配需要综合考虑多种因素,以下是详细分析不同场景下的分配建议以及具体的分配思路。 影响分配比例的因素 数据读…...
如何使用DHTMLX Scheduler的拖放功能,在 JS 日程安排日历中创建一组相同的事件
DHTMLX Scheduler 是一个全面的调度解决方案,涵盖了与规划事件相关的广泛需求。假设您在我们的 Scheduler 文档中找不到任何功能,并且希望在我们的 Scheduler 文档中看到您的项目。在这种情况下,很可能可以使用自定义解决方案来实现此类功能。…...
矩阵元素的“鞍点”
题意: 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。 本题要求编写程序,求一个给定的n阶方阵的鞍点。 输入格式: 输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数…...
Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示
1、现象:当Qt的窗口最小化时,isVisible值一定是true,这是正常的。 解释:在Qt中,当你点击窗口的最小化按钮时,Qt内部不会自动调用 hide() 方或 setVisible(false) 来隐藏窗口。相反,它会改变窗口…...
Unity-Mirror网络框架-从入门到精通之LagCompensation示例
文章目录 前言什么是滞后补偿Lag Compensation示例延迟补偿原理ServerCubeClientCubeCapture2DSnapshot3D补充LagCompensation.cs 独立算法滞后补偿器组件注意:算法最小示例前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mir…...
Jenkins 通过 Execute Shell 执行 shell 脚本 七
Jenkins 通过 Execute Shell 执行 shell 脚本 七 一、创建 .sh 文件 项目目录下新建 .sh 文件 jenkins-script\shell\ci_android_master.sh添加 Execute Shell 模块 在 Command 中添加 # 获取 .sh 路径 CI_ANDROID_MASTER_PATH"${WORKSPACE}/jenkins-script/shell/…...
PyCharm 批量替换
选择替换的内容 1. 打开全局替换窗口 有两种方式可以打开全局替换窗口: 快捷键方式: 在 Windows 或 Linux 系统下,按下 Ctrl Shift R。在 Mac 系统下,按下 Command Shift R。菜单操作方式:点击菜单栏中的 Edit&…...
Linux-文件基本操作
1.基本概念 文件: 一组相关数据的集合 文件名: 01.sh //文件名 2.linux下的文件类型 b block 块设备文件 eg: 硬盘 c character 字符设备文件 eg: 鼠标,键盘 d directory 目录文件 eg: 文件夹 - regular 常规文件…...
HTTP 请求头、响应头常见字段分析
目录 请求头AcceptAccept-EncodingUser-AgentConnectionCache-ControlHost 响应头Content-EncodingETagContent-TypeVaryx-business-use-case-usageAccess-Control-Allow-Originfacebook-api-versionStrict-Transport-SecurityPragmaCache-ControlExpiresx-fb-request-id 和 x-…...
postman登录cookie设置
1.设置环境变量, 定义变量存放共享的登录信息 如Cookie 2.登录接口编码test脚本获取cookie信息 let jsessionidCookie pm.cookies.get("JSESSIONID");if (jsessionidCookie) {let cookie "JSESSIONID" jsessionidCookie "; Admin-Tok…...
Oracle临时表空间(基础操作)
临时表空间 临时表空间:用来存放用户的临时数据,临时数据在需要时被覆盖,关闭数据库后自动删除,其中不能存放永久性数据。 用户进程和服务器进程是一对一的叫做专用连接。 任何一个用户连到oracle数据库,oracle都会…...
数据结构-基础
1、概念: 程序 数据结构 算法 2、程序的好坏 可读性,稳定性,扩展性,时间复杂度,空间复杂度。 3、数据结构 是指存储、组织数据的方式,以便高效地进行访问和修改。通过选择适当的数据结构, 能…...
2024年博客之星年度评选—主题文章创作评审文章得分公布
博客之星活动地址:https://www.csdn.net/blogstar2024 创作影响力评审入围名单:https://blogdev.blog.csdn.net/article/details/145189549 目录 主题文章创作评审得分排名 主题文章创作说明 主题文章评选说明 创作影响力评审主题文章创作评审目前排名 博…...
【科技时讯】2025年2月13日科技新闻速递
文章目录 2025年2月13日科技新闻速递1. OpenAI宣布GPT系列重大升级计划2. 华为云推出DeepSeek V3/R1满血版模型3. 全球科技行业动态4. 国内科技企业动态5. 数字经济与统计制度革新6. 资本市场与科技股表现7. 科技新闻逻辑关系图 2025年2月13日科技新闻速递 1. OpenAI宣布GPT系…...
AGI的基石:什么是机器学习
什么是机器学习:机器学习是人工智能的子集,深度学习是其重要的组成部分,包括不限于:deep neural networks 、deep belief networks和recurrent neural networks。在深度学习中,有三种基本的神经网络架构:FF…...
