Spring常见面试题汇总
文章目录
- 在Spring中,Bean的作用域有哪几个?
- SpringMVC的执行流程你知道吗?
- 谈谈你对Spring IOC的理解?
- DI又是什么?
- 谈谈你对Spring AOP的理解?
- Spring Bean的生命周期你能说出多少?
- Spring如何解决循环依赖的问题?
- 什么是循环依赖?
- 案例引入
- 产生循环依赖的三种情况
- 循环依赖的解决
在Spring中,Bean的作用域有哪几个?
singleton:单例prototype:多例request:spring创建一个bean,并将其放入到request域当中session:spring创建一个bean,并将其放入到session域当中global session:全局作用域,所有会话共享一个作用域
SpringMVC的执行流程你知道吗?
DispatcherServlet执行请求的解析与转发,将请求转发给HandlerMapperHandlerMapping返回资源的执行顺序HandlerExcutionChainDispatcherServlet再调用HandlerAdapter,请求执行handlerHandlerAdapter到Handler请求资源Handler返回一个ModelAndView(Handler相当于我们自己写的controller)DispatcherServlet将ModelAndView发送给视图解析器ViewResolverViewResolver解析ModelAndView返回一个视图对象ViewDispatcherServlet对view渲染,将数据显示在页面上

- DispatcherServlet:相当于转发器
- HandlerMapping:请求URL查找handler
- HandlerAdapter:执行handler
- Handler:需要我们自己开发
- ViewResolver:视图解析器,进行视图解析
谈谈你对Spring IOC的理解?
IOC,Inversion Of Control,控制反转,即将创建对象的权利移交给spring容器,由spring容器来统一管理对象及其生命周期和对象之间的依赖关系。
控制:创建对象的权利
反转:将创建对象的权利交给spring容器
之前我们创建某个对象的时候,主动权在我们自己手中,所以我们可以使用new关键字去创建一个对象,但是在这种情况下,会造成对象和其他类耦合的情况。但是引入IOC之后,创建对象的主动权就在spring容器手中了,当我们需要某个对象的时候,只需要向spring容器去要就可以了。可以看出,IOC能起到解耦的作用。
spring IOC用到了工厂设计模式。


DI又是什么?
通过上个问题,我们知道IOC只是一种设计思想,它是指将创建对象的权利交给spring容器,而这种思想就是依靠DI来实现的。
DI:Dependency Injection,即依赖注入,DI是反射思想的体现,即允许在程序运行时动态的生成对象。
谈谈你对Spring AOP的理解?
AOP:Aspect oriented programming, 即面向切面编程,是面向对象的一种补充。AOP的含义就是将对多个对象产生影响的公共行为和逻辑抽取出来并封装成一个通用的模块,这个模块就叫做切面,所以AOP可以提高代码复用和解耦。
Spring AOP中的几个概念:
- 切点:被增强的目标方法
- 通知:对目标方法进行增强的方法
- 切面:通知和切点的结合
- 织入:切点和通知结合的过程
- 切面类:含有通知方法
具体可以看我写的这一篇文章:你还不知道什么是Spring AOP?
Spring Bean的生命周期你能说出多少?
总的来说,Spring Bean的生命周期可以分为四个阶段:
- 实例化:
Instantiation - 属性赋值:
Populate - 初始化:
Initialization - 销毁:
Destruction

接下来,我们对这四个阶段扩展一下:

我们再来详细解读一下这几个过程:
- 实例化:实例化一个
Bean - 属性赋值:为
Bean设置相关属性和依赖 Aware接口:让Bean能拿到容器的一些资源
BeanPostProcessor:如果想对Bean进行一些自定义的前置处理,那么可以让Bean实现了BeanPostProcessor接口
InitializingBean:如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
init-method:如果Bean在Spring配置文件中配置了init-method属性,则会自动调用其配置的初始化方法。
BeanPostProcessor后置处理:如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法DisposableBean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法
destroy-method:最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
Spring如何解决循环依赖的问题?
什么是循环依赖?
类与类之间的关系形成了一个闭环,比如下图中,A依赖了B,B又依赖于A:

是不是有点儿像操作系统中的死锁问题?
案例引入
public class ClassA {private ClassB classB;public ClassB getClassB() {return classB;}public void setClassB(ClassB classB) {this.classB = classB;}
}
public class ClassB {private ClassA classA;public ClassA getClassA() {return classA;}public void setClassA(ClassA classA) {this.classA = classA;}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="classA" class="ioc.cd.ClassA"><property name="classB" ref="classB"></property></bean><bean id="classB" class="ioc.cd.ClassB"><property name="classA" ref="classA"></property></bean>
</beans>
@Testpublic void test() throws Exception {// 创建IoC容器,并进行初始化String resource = "spring/spring-ioc-circular-dependency.xml";ApplicationContext context = new ClassPathXmlApplicationContext(resource);// 获取ClassA的实例(此时会发生循环依赖)ClassA classA = (ClassA) context.getBean(ClassA.class);}
产生循环依赖的三种情况
- 通过构造方法进行依赖注入
- 通过
setter方法进行依赖注入(多例模式下) - 通过
setter方法进行依赖注入(单例模式下)
第三种已经被解决,第一种情况下,在new的时候会被堵塞,创建A的时候依赖于B,创建B又依赖于A,导致new不出来;第二种情况下,每次调用getBean()时,都会产生一个新的Bean,这样就会产生N个Bean,最终抛出内存溢出异常。
循环依赖的解决
在Spring中,有三大缓存:一级缓存,二级缓存,三级缓存。
- 一级缓存:存储单例模式下创建的
Bean(已经创建完成的),对外使用 - 二级缓存:存储单例模式下创建的
Bean(正在创建中的),对内使用 - 三级缓存:通过
ObjectFactory存储单例模式下的Bean(正在创建中的),对内使用(三级缓存使用ObjectFacotory来存储的原因是,如果对象实现了AOP,注入到其他Bean的时候并不是最终的代理对象,而是原始的。这时就需要通过三级缓存的ObjectFactory才能提前产生最终的需要代理的对象。)
Spring主要依靠二级缓存和三级缓存来解决单例模式下setter方法进行依赖注入时产生循环依赖的问题。
解决单例模式下setter方法进行依赖注入时产生循环依赖的问题,是Spring自动解决的,通过构造方法进行依赖注入时所产生的循环依赖问题需要我们人为解决,常见的解决方案就是@Lazy注解,@Lazy注解的作用就是延迟加载。比如,我们想创建对象A,此时A依赖于B,但当使用@Lazy注解之后,在创建A时,就会基于动态代理去创建一个代理类B1,也就是此时A依赖于B1,B依赖于A。要注意的是,在注入依赖时,类A并没有完全的初始化完,实际上注入的是一个代理对象,只有当他首次被使用的时候才会被完全的初始化。
参考文章:Spring如何解决循环依赖

整理面经不易,觉得有帮助的小伙伴点个赞再走吧~感谢收看!
相关文章:
Spring常见面试题汇总
文章目录 在Spring中,Bean的作用域有哪几个?SpringMVC的执行流程你知道吗?谈谈你对Spring IOC的理解?DI又是什么?谈谈你对Spring AOP的理解?Spring Bean的生命周期你能说出多少?Spring如何解决循…...
javaEE汽车用油加油站销售管理系统servlet
经过我的实地考察,我发现现在的销售管理有以下弊端: (1)、大多数都是人工记录,人工开票,这样既费时费力,还费财; (2)、由于品种种类的增多,记录货品的资料变得麻烦; (3)、对一些顾客…...
CSS动画
CSS中的动画类型 transition补间动画(有开头有结尾,浏览器自己补中间) 要求元素状态有变化,如hover .container{width:100px;height:100px;background:red;transition:width 1s;/*transition-delay:1s 延迟一秒再动*//*tranisi…...
《花雕学AI》21:ChatGPT能否应对脑筋急转弯?逻辑推理和创造性思维的大考验!
当我们谈到脑筋急转弯时,很多人都会感到兴趣和好奇。脑筋急转弯是一种智力游戏,可以锻炼我们的思维能力以及解决问题的能力。然而,对于许多人来说,脑筋急转弯也是一项相当具有挑战性的任务。在这个过程中,我们需要运用…...
【Vue】学习笔记-列表渲染/数据监视
列表渲染/数据监视 基本列表Key的作用与原理列表过滤列表排序Vue 数据监视原理 基本列表 v-for指令 用于展示列表数据语法:v-for“(item,index) in xxx” :key“yyy”可遍历:数组,对象,字符串(用的很少)&…...
人工标注或成过去式?SSA语义分割框架、SSA-engine自动类别标注引擎,大幅提升细粒度语义标注效率
推荐语 4月5日,Meta发布 Segment Anything 模型和 SA-1B 数据集,引发CV届“地震”,其凭借一己之力,成功改写了物体检测、数据标注、图像分割等任务的游戏规则。 复旦大学ZVG实验室团队基于此最新开源了SSA语义分割框架和SSA-engin…...
远程工具在哪里打开?使用教程
在现在的互联网时代,越来越多的人开始采用远程工具来处理工作。无论你是在家里还是在办公室,使用远程工具可以让你更加高效地完成工作,同时也可以帮助你与其他人更好地沟通。但是,对于一些新手来说,使用远程工具可能会…...
HBase高手之路7—HBase之全文检索Phoneix
文章目录 HBase之全文检索Phoenix一、全文检索二、全文检索工具phoenix简介1. 简介2. 使用Phoenix是否会影响HBase性能3. 哪些公司在使用Phoenix4. 官方性能测试4.1 Phoenix对标Hive(基于HDFS和HBase)4.2 Phoenix对标Impala4.3 关于上述官网两张性能测试…...
城镇水务系统碳减排路径|雨水系统
1.1 雨水系统 1.1.1碳减排路径分析 雨水系统碳排放主要来自于规划建设阶段。在压力流系统以及低洼点位排水过程中,随着水泵使用也会造成一定碳排放。在雨水系统规划建设过程中,应优先使用绿色基础设施、绿色建材;在运行过程中,雨…...
摆花
[NOIP2012 普及组] 摆花 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m m m 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 n n n 种花,从 1 1 1 到 n n n 标号。为了在门口展出更…...
newman结合jenkins实现自动化测试
一、背景 为了更好的保障产品质量和提升工作效率,使用自动化技术来执行测试用例。 二、技术实现 三、工具安装 3.1 安装newman npm install -g newman查看newman版本安装是否成功,打开命令行,输入newman -v,出现 版本信息即安…...
九种 OOM 常见原因及解决方案(IT枫斗者)
九种 OOM 常见原因及解决方案(IT枫斗者) 什么是OOM? OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。看下关于的官方说明:Thrown when the Java Virtual Machine canno…...
远程代码执行渗透与防御
远程代码执行渗透与防御 1.简介2.PHP RCE常见函数3.靶场练习4.防御姿势 1.简介 远程代码执行漏洞又叫命令注入漏洞 命令注入是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。 当应用程序将不安全的用户提供的数据(表单、cook…...
Activiti7原生整合和工作流相关概念详解
一、概述 Activiti是一个工作流引擎, Activiti可以将业务系统中复杂的业务流程抽取出来,并用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由Activiti进行管理,减少业务系统由…...
核心业务4:标的管理
核心业务4:标的管理 1.标的管理流程图 2.数据库表设计 3.前端逻辑设计 4.后端逻辑设计 5.标的放款TODO 核心业务4:标的管理 1.标的管理流程图 ①上一个核心业务通过审核借款申请结束...
面向计算机视觉的深度学习:6~10
原文:Deep Learning for Computer Vision 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如何实…...
【LeetCode 图论 一】初探有向图Directed Graph
今天主要介绍DAG (Directed acyclic graph),有向无环图。 无向图的问题相对有向图比较简单,比如岛屿问题,迷宫问题等。 在有向图中,我们通常只关注环是否存在,因为有向图中环的存在会让我们的…...
计算机视觉:图片数据的预处理
本文重点 图片数据是计算机视觉处理的核心,一般的图片数据并不能直接放到神经网络中,而是应该使用一些数据与处理的方式来解决,这个操作我们称为图片数据的预处理。 图像缩放 图像缩放是指将图像的尺寸调整为所需的大小。在AI中,图像缩放通常用于将图像调整为模型所需的…...
探秘C++中的神奇组合:std--pair的魅力之旅
探秘C中的神奇组合:std::pair的魅力之旅 引言std::pair简介及基本概念(An Overview and Basic Concepts of std::pair)std::pair的结构及构造方法(Structure and Construction Methods of std::pair)std::pair的常用成…...
Win10搭建我的世界Minecraft服务器「内网穿透远程联机」
文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …...
中国500万医生的新AI:顶刊独家联手,卷的就是证据源
金磊 发自 杭州量子位 | 公众号 QbitAI很反差。明明是一场AI的发布会,台下却坐满了医学界的大佬们:有北大、清华的,有浙江、上海的,甚至医学顶刊BMJ集团的主编都来围观了……△图片由AI生成为啥会这样?因为阿里健康正式…...
OpenClaw自动化配置实战:从入门到精通,打造高效工作流
1. 项目概述与核心价值最近在折腾开源自动化工具,发现了一个宝藏仓库:ShuyuZ1999/awesome-openclaw-configs。这个项目乍一看名字有点长,但核心价值非常明确——它是一个专门为开源自动化工具OpenClaw收集、整理和分享高质量配置文件的集合。…...
C#面向对象封装详解:从字段到属性,为什么要用属性?
封装详解:从字段到属性1. 什么是封装封装是指隐藏类的内部实现细节,仅对外提供安全的访问接口,通过控制数据的读写操作来确保数据安全性。其核心目的是保护类中重要的内部数据。2. 字段直接暴露的问题当直接使用字段而不定义属性时࿰…...
HoRain云--Skills 基本结构
🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...
单卡训练mmsegmentation模型?先把这个SyncBN改成BN(附完整配置文件修改指南)
单卡训练mmsegmentation模型?先解决SyncBN这个关键配置 当你第一次在个人电脑或实验室的单一GPU设备上运行mmsegmentation训练脚本时,屏幕上突然弹出的SyncBN相关错误信息可能会让兴奋的心情瞬间跌入谷底。这个看似简单的配置问题,实际上反映…...
基于ARM嵌入式平台与AI视觉的输电线路智能巡检系统设计与实现
1. 项目概述:输电线路巡检的智能化转型 输电线路作为电力系统的“大动脉”,其安全稳定运行至关重要。传统的线路巡检主要依赖人工,巡检人员需要跋山涉水,通过望远镜、红外测温仪等设备进行观测和记录。这种方式不仅劳动强度大、效…...
智能视觉组的比赛方案建议
简 介: 【智能视觉组比赛评分改进建议】针对不同比赛地图导致成绩评判不公的问题,建议赛前准备多张固定地图并测算标准时间:1)由官方测试每张地图的理论最优时间和实际小车运行时间;2)比赛成绩以选手用时与…...
如何快速解决多设备滚动冲突:Scroll Reverser终极配置指南
如何快速解决多设备滚动冲突:Scroll Reverser终极配置指南 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否曾经在Mac上同时使用触控板和鼠标时,被混…...
中小企业如何通过Taotoken的Token Plan套餐控制AI集成成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 中小企业如何通过Taotoken的Token Plan套餐控制AI集成成本 应用场景类,中小企业在为官网或CRM系统集成AI功能时&#x…...
多智能体AI如何自动化代码分析与项目规划:从原理到实践
1. 项目概述:当AI项目经理走进你的代码库 最近在GitHub上看到一个挺有意思的项目,叫“Harness_Multi-Agent_AI_PM”。光看名字,你可能会觉得这又是一个蹭AI热度的概念性玩具。但作为一个在软件工程和项目管理一线摸爬滚打了十多年的老鸟&…...
