Spring常见面试题汇总

news2024/11/29 12:56:01

文章目录

    • 在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/beans
        http://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>
	@Test
	public 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如何解决循环依赖

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sggJava基础第三天

运算符 运算符是一种特殊的符号&#xff0c;用以表示数据的运算、赋值和比较等。 算术运算符 赋值运算符 比较运算符&#xff08;关系运算符&#xff09; 逻辑运算符 位运算符&#xff08;这个几乎不使用&#xff0c;我们在讲解的时候了解一下即可&#xff0c;只不过…

敏捷团队如何在 PingCode 这类敏捷开发工具中管理 Scrum 开发管理流程

在本教程中&#xff0c;我们将在 PingCode 中介绍如何使用 Scrum 项目、创建产品待办列表和规划迭代、举行 Scrum 会议等详细流程。准备工作&#xff1a;已创建 PingCode 软件帐户 【免费注册通道】 什么是Scrum&#xff1f;Scrum 是国内外最热门的敏捷开发框架之一。Scrum 通…

【SpringBoot2】SpringBoot基础篇

SpringBoot基础篇 JC-1.快速上手SpringBoot ​ 学习任意一项技术&#xff0c;首先要知道这个技术的作用是什么&#xff0c;不然学完以后&#xff0c;你都不知道什么时候使用这个技术&#xff0c;也就是技术对应的应用场景。SpringBoot技术由Pivotal团队研发制作&#xff0c;功…

第三章 word2vec

目录3.1 基于推理的方法和神经网络3.1.1 基于计数的方法的问题3.1.2 基于推理的方法的概要3.1.3 神经网络中单词的处理方法3.2 简单的 word2vec3.2.1 CBOW模型的推理3.2.2 CBOW模型的学习3.2.3 word2vec的权重和分布式表示3.3 学习数据的准备3.3.1 上下文和目标词3.3.2 转化为o…

loki采集k8s日志

前言 loki 是轻量、易用的日志聚合系统。如果你的k8s集群规模并不大&#xff0c;推荐使用grafanaloki的方案来做微服务日志的采集&#xff1b; Loki组成 loki架构很简单&#xff0c;主要由3部分组成&#xff1a; loki&#xff1a;服务端&#xff0c;负责存储日志和处理查询&…

行程器,数显卡尺液晶驱动IC,VK1623段码LCD驱动芯片资料分享,封装LQFP100,QFP100,RAM映射48EGx8COM

永嘉微电/VINKA 型号&#xff1a;VK1623 封装形式&#xff1a;LQFP100/QFP100/DICE/COG KPP2609 概述 VK1623S是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大384点&#xff08;48EGx8COM&#xff09;的LCD屏。单片机可通过3/4线串行接口配置显示参数和发送显示数据…

Spring Cloud微服务网关Zuul的注解@EnableZuulProxy或@EnableZuulServer做了什么事情

一、Zuul的工作原理 Zuul 1.x的版本是由Servlet以及一系列的Filter组成的&#xff0c;各个组件之间协同合作完成功能&#xff0c;且易于扩展。参看官方的架构图我画了张图&#xff1a; Zuul声明周期&#xff1a; HTTP Request -> DispatcherServlet -> ZuulHandlerMappi…

动力节点老杜Vue3视频笔记——Vue程序初体验

目录 一、Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 一、Vue程序初体验 可以先不去了解Vue框架的发展历史、Vue框架有什么特点、Vue是谁开发的&#xff0c;对我们编写Vue程序起不到太大的作用&#xff0c;…

代码随想录_二叉树_leetcode654 617

leetcode654 最大二叉树 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 …

octave安装使用——吴恩达机器学习

下载octave 解压后双击octave.vbs进行安装 配置 pkg rebuildpkg list 使用基础命令 使用矩阵命令 移动数据 size&#xff1a;矩阵的行和列length&#xff1a;行和列的最大值 读取和存储数据 load&#xff1a;加载文件who&#xff1a;所有变量whos&#xff1a;更详细的变量…

界面开发框架Qt - 组合小部件映射器示例

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 Combo Widget Mappe…

人工智能实验二:约束满足问题

一、实验目的 求解约束满足问题&#xff1b;使用回溯搜索算法求解八皇后问题。 二、实验平台 课程实训平台https://www.educoder.net/paths/369 三、实验内容及步骤 实训内容&#xff1a;2-4 第六章 约束满足问题 1.问题描述 八皇后问题是指在一个 88 的棋盘上摆放八个皇…

Spark运行模式介绍

文章目录1. Local运行模式1.1 基本运行情况介绍1.2 角色划分1.3 Spark 任务提交与解释器对比2. StandAlone运行模式2.1 StandAlone介绍2.2 StandAlone架构2.3 Spark应用架构2.4 StandAlone HA 运行原理3. Spark on YARN3.1 Spark on Yarn 本质3.2 部署模式3.3 两种部署模式运行…

stata变量引用

stata变量引用–潘登同学的stata笔记 文章目录stata变量引用--潘登同学的stata笔记变量生成gen命令通配符&#xff1a;*, ?, -因子变量时间序列变量命名、前缀与标签变量命名、添加前缀通配符与批量重命名变量标签数字-文字对应表CSMAR数据处理查看、查找变量单值、暂元单值暂…

TCP网络连接的书写

TCP网络连接的书写 文章目录TCP网络连接的书写服务器端书写进程sock创建创建bind进行端口绑定(进行bind的初始化)监听socket获取链接用户端创建sock套接字connect进行连接服务器端书写 为TCP是面向连接,所有需要进行对于端口进行监控&#xff0c;另外的UDP的服务器就不需要进行…

洛克菲勒:世界上只有两种人头脑聪明...

洛克菲勒&#xff1a;被人称为“石油大王”、美国第一位十亿富豪与全球首富、创办芝加哥大学。洛克菲勒写给儿子的信共有38封&#xff0c;这些信真实记录了洛克菲勒创造财富神话的种种业绩。从这些信中我们不仅可以看到洛克菲勒优良的品德、卓越的经商才能&#xff0c;还可窥见…

Spring面向切面编程AOP使用介绍

文章目录AOPAOP核心概念AOP快速入门AOP工作流程AOP切入点表达式AOP通知类型AOP通知获取数据AOP总结AOP AOP核心概念 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构 OOP(Object Oriented Programming)面向对象…

Web自动化测试的详细流程和步骤,一篇足矣

Web自动化测试是软件测试中非常重要的一种测试方法&#xff0c;它通过编写脚本来模拟人工操作网页&#xff0c;从而实现对Web应用程序进行自动化测试的过程。为了保证测试质量和效率&#xff0c;我们需要遵循一定的流程和步骤来完成Web自动化测试。 一、测试环境准备 在进行W…

webp怎么转换成png,4个方法教你快速处理

webp怎么转换成png&#xff1f;目前在一些比较大的图片素材网站下载的图片都是webp格式的。我们都知道webp格式图片&#xff0c;它在正常的图片浏览器中是无法打开的。 所以说我们要把webp图片转变成png格式&#xff0c;正常来说我们常用的图片处理软件也能进行格式转换&#x…

都说互联网不行了,真的是这样吗?

最近在马士兵教育的课堂上经常会听到学员说这样的话&#xff1a; 现在公司都不招人&#xff0c;程序员根本找不到工作 早知道IT行业这么难&#xff0c;当初就不学编程了 简历石沉大海、面试机会也没有&#xff0c;互联网是不是不行了 互联网行情到底如何&#xff1f; 作为…