当前位置: 首页 > news >正文

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执行请求的解析与转发,将请求转发给HandlerMapper
  • HandlerMapping返回资源的执行顺序HandlerExcutionChain
  • DispatcherServlet再调用HandlerAdapter,请求执行handler
  • HandlerAdapterHandler请求资源
  • Handler返回一个ModelAndView(Handler相当于我们自己写的controller)
  • DispatcherServletModelAndView发送给视图解析器ViewResolver
  • ViewResolver解析ModelAndView返回一个视图对象View
  • DispatcherServletview渲染,将数据显示在页面上

在这里插入图片描述

  • DispatcherServlet:相当于转发器
  • HandlerMapping:请求URL查找handler
  • HandlerAdapter:执行handler
  • Handler:需要我们自己开发
  • ViewResolver:视图解析器,进行视图解析

谈谈你对Spring IOC的理解?

IOCInversion Of Control,控制反转,即将创建对象的权利移交给spring容器,由spring容器来统一管理对象及其生命周期和对象之间的依赖关系。

控制:创建对象的权利
反转:将创建对象的权利交给spring容器

之前我们创建某个对象的时候,主动权在我们自己手中,所以我们可以使用new关键字去创建一个对象,但是在这种情况下,会造成对象和其他类耦合的情况。但是引入IOC之后,创建对象的主动权就在spring容器手中了,当我们需要某个对象的时候,只需要向spring容器去要就可以了。可以看出,IOC能起到解耦的作用。

spring IOC用到了工厂设计模式。
在这里插入图片描述
在这里插入图片描述

DI又是什么?

通过上个问题,我们知道IOC只是一种设计思想,它是指将创建对象的权利交给spring容器,而这种思想就是依靠DI来实现的。
DIDependency Injection,即依赖注入,DI是反射思想的体现,即允许在程序运行时动态的生成对象。

谈谈你对Spring AOP的理解?

AOPAspect oriented programming, 即面向切面编程,是面向对象的一种补充。AOP的含义就是将对多个对象产生影响的公共行为和逻辑抽取出来并封装成一个通用的模块,这个模块就叫做切面,所以AOP可以提高代码复用和解耦。

Spring AOP中的几个概念:

  • 切点:被增强的目标方法
  • 通知:对目标方法进行增强的方法
  • 切面:通知和切点的结合
  • 织入:切点和通知结合的过程
  • 切面类:含有通知方法

具体可以看我写的这一篇文章:你还不知道什么是Spring AOP?

Spring Bean的生命周期你能说出多少?

总的来说,Spring Bean的生命周期可以分为四个阶段:

  • 实例化:Instantiation
  • 属性赋值:Populate
  • 初始化:Initialization
  • 销毁:Destruction

在这里插入图片描述
接下来,我们对这四个阶段扩展一下:
在这里插入图片描述
我们再来详细解读一下这几个过程:

  1. 实例化:实例化一个Bean
  2. 属性赋值:为Bean设置相关属性和依赖
  3. Aware接口:让Bean能拿到容器的一些资源
    BeanPostProcessor:如果想对Bean进行一些自定义的前置处理,那么可以让Bean实现了BeanPostProcessor接口
    InitializingBean:如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
    init-method:如果BeanSpring配置文件中配置了init-method属性,则会自动调用其配置的初始化方法。
    BeanPostProcessor后置处理:如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法
  4. DisposableBean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法
    destroy-method:最后,如果这个BeanSpring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

Spring如何解决循环依赖的问题?

什么是循环依赖?

类与类之间的关系形成了一个闭环,比如下图中,A依赖了BB又依赖于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,这样就会产生NBean,最终抛出内存溢出异常。

循环依赖的解决

Spring中,有三大缓存:一级缓存,二级缓存,三级缓存。

  • 一级缓存:存储单例模式下创建的Bean(已经创建完成的),对外使用
  • 二级缓存:存储单例模式下创建的Bean(正在创建中的),对内使用
  • 三级缓存:通过ObjectFactory存储单例模式下的Bean(正在创建中的),对内使用(三级缓存使用ObjectFacotory来存储的原因是,如果对象实现了AOP,注入到其他Bean的时候并不是最终的代理对象,而是原始的。这时就需要通过三级缓存的ObjectFactory才能提前产生最终的需要代理的对象。)

Spring主要依靠二级缓存和三级缓存来解决单例模式下setter方法进行依赖注入时产生循环依赖的问题。

解决单例模式下setter方法进行依赖注入时产生循环依赖的问题,是Spring自动解决的,通过构造方法进行依赖注入时所产生的循环依赖问题需要我们人为解决,常见的解决方案就是@Lazy注解,@Lazy注解的作用就是延迟加载。比如,我们想创建对象A,此时A依赖于B,但当使用@Lazy注解之后,在创建A时,就会基于动态代理去创建一个代理类B1,也就是此时A依赖于B1B依赖于A。要注意的是,在注入依赖时,类A并没有完全的初始化完,实际上注入的是一个代理对象,只有当他首次被使用的时候才会被完全的初始化。

参考文章:Spring如何解决循环依赖

在这里插入图片描述

整理面经不易,觉得有帮助的小伙伴点个赞再走吧~感谢收看!

相关文章:

Spring常见面试题汇总

文章目录 在Spring中&#xff0c;Bean的作用域有哪几个&#xff1f;SpringMVC的执行流程你知道吗&#xff1f;谈谈你对Spring IOC的理解&#xff1f;DI又是什么&#xff1f;谈谈你对Spring AOP的理解&#xff1f;Spring Bean的生命周期你能说出多少&#xff1f;Spring如何解决循…...

javaEE汽车用油加油站销售管理系统servlet

经过我的实地考察&#xff0c;我发现现在的销售管理有以下弊端&#xff1a; (1)、大多数都是人工记录&#xff0c;人工开票&#xff0c;这样既费时费力&#xff0c;还费财&#xff1b; (2)、由于品种种类的增多&#xff0c;记录货品的资料变得麻烦&#xff1b; (3)、对一些顾客…...

CSS动画

CSS中的动画类型 transition补间动画&#xff08;有开头有结尾&#xff0c;浏览器自己补中间&#xff09; 要求元素状态有变化&#xff0c;如hover .container{width:100px;height:100px;background:red;transition:width 1s;/*transition-delay:1s 延迟一秒再动*//*tranisi…...

《花雕学AI》21:ChatGPT能否应对脑筋急转弯?逻辑推理和创造性思维的大考验!

当我们谈到脑筋急转弯时&#xff0c;很多人都会感到兴趣和好奇。脑筋急转弯是一种智力游戏&#xff0c;可以锻炼我们的思维能力以及解决问题的能力。然而&#xff0c;对于许多人来说&#xff0c;脑筋急转弯也是一项相当具有挑战性的任务。在这个过程中&#xff0c;我们需要运用…...

【Vue】学习笔记-列表渲染/数据监视

列表渲染/数据监视 基本列表Key的作用与原理列表过滤列表排序Vue 数据监视原理 基本列表 v-for指令 用于展示列表数据语法&#xff1a;v-for“(item,index) in xxx” :key“yyy”可遍历&#xff1a;数组&#xff0c;对象&#xff0c;字符串&#xff08;用的很少&#xff09;&…...

人工标注或成过去式?SSA语义分割框架、SSA-engine自动类别标注引擎,大幅提升细粒度语义标注效率

推荐语 4月5日&#xff0c;Meta发布 Segment Anything 模型和 SA-1B 数据集&#xff0c;引发CV届“地震”&#xff0c;其凭借一己之力&#xff0c;成功改写了物体检测、数据标注、图像分割等任务的游戏规则。 复旦大学ZVG实验室团队基于此最新开源了SSA语义分割框架和SSA-engin…...

远程工具在哪里打开?使用教程

在现在的互联网时代&#xff0c;越来越多的人开始采用远程工具来处理工作。无论你是在家里还是在办公室&#xff0c;使用远程工具可以让你更加高效地完成工作&#xff0c;同时也可以帮助你与其他人更好地沟通。但是&#xff0c;对于一些新手来说&#xff0c;使用远程工具可能会…...

HBase高手之路7—HBase之全文检索Phoneix

文章目录 HBase之全文检索Phoenix一、全文检索二、全文检索工具phoenix简介1. 简介2. 使用Phoenix是否会影响HBase性能3. 哪些公司在使用Phoenix4. 官方性能测试4.1 Phoenix对标Hive&#xff08;基于HDFS和HBase&#xff09;4.2 Phoenix对标Impala4.3 关于上述官网两张性能测试…...

城镇水务系统碳减排路径|雨水系统

1.1 雨水系统 1.1.1碳减排路径分析 雨水系统碳排放主要来自于规划建设阶段。在压力流系统以及低洼点位排水过程中&#xff0c;随着水泵使用也会造成一定碳排放。在雨水系统规划建设过程中&#xff0c;应优先使用绿色基础设施、绿色建材&#xff1b;在运行过程中&#xff0c;雨…...

摆花

[NOIP2012 普及组] 摆花 题目描述 小明的花店新开张&#xff0c;为了吸引顾客&#xff0c;他想在花店的门口摆上一排花&#xff0c;共 m m m 盆。通过调查顾客的喜好&#xff0c;小明列出了顾客最喜欢的 n n n 种花&#xff0c;从 1 1 1 到 n n n 标号。为了在门口展出更…...

newman结合jenkins实现自动化测试

一、背景 为了更好的保障产品质量和提升工作效率&#xff0c;使用自动化技术来执行测试用例。 二、技术实现 三、工具安装 3.1 安装newman npm install -g newman查看newman版本安装是否成功&#xff0c;打开命令行&#xff0c;输入newman -v&#xff0c;出现 版本信息即安…...

九种 OOM 常见原因及解决方案(IT枫斗者)

九种 OOM 常见原因及解决方案(IT枫斗者) 什么是OOM&#xff1f; OOM&#xff0c;全称“Out Of Memory”&#xff0c;翻译成中文就是“内存用完了”&#xff0c;来源于java.lang.OutOfMemoryError。看下关于的官方说明&#xff1a;Thrown when the Java Virtual Machine canno…...

远程代码执行渗透与防御

远程代码执行渗透与防御 1.简介2.PHP RCE常见函数3.靶场练习4.防御姿势 1.简介 远程代码执行漏洞又叫命令注入漏洞 命令注入是一种攻击&#xff0c;其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。 当应用程序将不安全的用户提供的数据&#xff08;表单、cook…...

Activiti7原生整合和工作流相关概念详解

一、概述 Activiti是一个工作流引擎&#xff0c; Activiti可以将业务系统中复杂的业务流程抽取出来&#xff0c;并用专门的建模语言BPMN2.0进行定义&#xff0c;业务流程按照预先定义的流程进行执行&#xff0c;实现了系统的流程由Activiti进行管理&#xff0c;减少业务系统由…...

核心业务4:标的管理

核心业务4:标的管理 1.标的管理流程图 2.数据库表设计 3.前端逻辑设计 4.后端逻辑设计 5.标的放款TODO 核心业务4:标的管理 1.标的管理流程图 ①上一个核心业务通过审核借款申请结束...

面向计算机视觉的深度学习:6~10

原文&#xff1a;Deep Learning for Computer Vision 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如何实…...

【LeetCode 图论 一】初探有向图Directed Graph

今天主要介绍DAG &#xff08;Directed acyclic graph&#xff09;&#xff0c;有向无环图。 无向图的问题相对有向图比较简单&#xff0c;比如岛屿问题&#xff0c;迷宫问题等。 在有向图中&#xff0c;我们通常只关注环是否存在&#xff0c;因为有向图中环的存在会让我们的…...

计算机视觉:图片数据的预处理

本文重点 图片数据是计算机视觉处理的核心,一般的图片数据并不能直接放到神经网络中,而是应该使用一些数据与处理的方式来解决,这个操作我们称为图片数据的预处理。 图像缩放 图像缩放是指将图像的尺寸调整为所需的大小。在AI中,图像缩放通常用于将图像调整为模型所需的…...

探秘C++中的神奇组合:std--pair的魅力之旅

探秘C中的神奇组合&#xff1a;std::pair的魅力之旅 引言std::pair简介及基本概念&#xff08;An Overview and Basic Concepts of std::pair&#xff09;std::pair的结构及构造方法&#xff08;Structure and Construction Methods of std::pair&#xff09;std::pair的常用成…...

Win10搭建我的世界Minecraft服务器「内网穿透远程联机」

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...