Spring 之面试题

spring核心模块面试题 这一模块的主要作用是通过 IOC 容器管理 Bean 的生命周期和依赖关系,从而简化应用程序的开发。Spring 中定义了多种 Bean 作用域,用于指定 Bean 的生命周期范围。循环依赖是指两个或多个 Bean 之间相互依赖,导致容器无法完成依赖注入。传统方式,使用 XML 文件定义 Bean 和依赖关系。通过 Setter 方法注入依赖,适用于可选依赖。使用 Java 配置类定义 Bean。通过构造器注入依赖,适用于必须的依赖。使用注解标记 Bean 和依赖关系。 阅读详情


Spring面试底层原理的那些问题,你是不是真的懂Spring?

说一下Spring中Bean的生命周期

实例化、属性赋值、初始化、销毁。
1、实例化: 根据配置中的 BeanDefinition 实例化 Bean。调用了Bean的构造函数。
2、属性赋值: Spring 使用依赖注入(构造器或者setter)填充所有属性。
3、初始化之前: 调用 BeanPostProcessors 实现类并注入到容器中的Bean的初始化之前方法。
4、初始化: 调用初始化方法,如果指定了初始化方法。
5、初始化之后: 调用 BeanPostProcessors 实现类并注入到容器中的Bean的初始化之后方法。
6、销毁: 当容器关闭时,调用指定的销毁方法。

Spring怎么解决循环依赖

https://blog.youkuaiyun.com/weixin_42390873/article/details/113581473

1、实例化A,A添加到三级缓存。
2、A属性赋值,赋值B对象。
3、从一级缓存中获取 B,获取不到,会实例化 B。
4、B添加到三级缓存。
5、B属性赋值,赋值A对象,依次从一级缓存到三级缓存获取B,最终从三级缓存获取到A,然后将A放到二级缓存。
6、B初始化完毕,将B放入一级缓存,并且从二级三级缓存中移除。B创建完毕,赋值给A。
7、A初始化完毕,将A放入一级缓存,并且从二级三级缓存中移除。
8、A创建完毕。

流程图:
在这里插入图片描述

为什么通过构造器无法解决循环依赖?
因为Spring解决循环依赖是通过Bean的中间态完成的,这个中间态是已经实例化但尚未初始化的状态,也就是一个半成品。
如果实例化的过程中通过构造器创建,无法将一个对象提前暴露出来,因为这时还未创建好,所以构造器无法解决循环依赖。

二级缓存能否解决循环依赖?
通过上面的分析,其实把二级缓存拿掉,在 B 尝试获取 A 的时候直接返回 A 的实例,其实也是可以的。

但是为什么还是用三级缓存呢?
主要为了解决动态代理场景下的循环依赖。
如果去掉三级缓存:在创建代理对象的时候对Bean生命周期有影响。
如果去掉二级缓存:如果A依赖B和C,切B和C也依赖A,三级缓存的getObject()返回的是代理对象,会导致B和C依赖了不同的A。
如果只保留一级缓存呢:如果A依赖B,在实例化B的时候,从一级缓存是获取不到A的,因为这时A还未初始化完毕。

什么是IOC

Spring的IOC,你真的能解释清楚吗?

草率的回答: IOC 是控制反转,Inverse of Control 。
亲,你在做名词翻译吗?作为面试官不应该只想听到这么一点点吧。

IOC是一种编程原则,它的设计和架构可以实现组件间的解耦,核心思想是将控制权转移出去。
对象间的依赖关系的维护权利交给了 Spring ,程序本身不再维护。
IOC 为了实现解耦,将原有的对象间的主动依赖改为被动接收型依赖(由直接 new 变为 set )。

IOC与DI、DL的区别

DI:依赖注入,依赖上下文被动接收,暴露setter方法即可,public void setXXX() { ... }
DL:依赖查找,使用上下文(容器)主动获取,applicationContext.getBean(beanName)
IOC 是一种思想、编程原则,DI、DL 是 IOC 思想的一种实现方式。
IOC 的实现方式有依赖查找( Dependency lookup )和依赖注入( Dependency Injection )。

SpringFramework中实现的IOC有什么

BeanFactory 接口提供了一个抽象的配置和对象的管理机制。
ApplicationContext 是 BeanFactory 的子接口,它提供了 AOP 的支持、Web 环境的扩展( WebApplicationContext)、事件发布机制(ApplicationEvent)、Bean后置处理器的支持(BeanPostProcessor )。

BeanFactory与FactoryBean的区别

BeanFactory: IOC 的最底层容器接口。(ApplicationContext 在最底层组合了 BeanFactory)
FactoryBean: 创建对象的工厂 Bean ,可以使用它来直接创建一些初始化流程比较复杂的对象。

BeanFactory 和 ApplicationContext 有什么区别?
BeanFactory是Spring中最底层的IOC容器接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能。
ApplicationContext 是Spring的一个更高级的容器,是 BeanFactory 子接口,提供了更多的有用的功能。
注意: ApplicationContext 是基于 BeanFactory 的扩展而不是继承!因为在底层,无论是 AbstractRefreshableApplicationContext 还是 GenericApplicationContext ,底层都是组合了一个 DefaultListableBeanFactory 。

ApplicationContext 主要扩展了以下功能: AOP 的支持、配置元信息(BeanDefinition)、资源管理、事件驱动机制、消息与国际化。

ApplicationContext的类型

ApplicationContext 分为两种:

  • 基于 xml 配置文件(ClassPathXmlApplicationContext 、FileSystemXmlApplicationContext )区别是加载 xml 配置文件的基准路径不同。
  • 基于注解驱动配置类,只有 AnnotationConfigApplicationContext

对比BeanPostProcessor与BeanFactoryPostProcessor

在这里插入图片描述

依赖注入的注入方式

  • 构造器注入:xml、编程式注入,不依赖Spring框架的API
    在这里插入图片描述
    在这里插入图片描述
  • setter注入:xml、编程式注入,不依赖Spring框架的API
    在这里插入图片描述
    在这里插入图片描述
  • 参数注入:只能通过标注注解来侵入式注入,依赖Spring框架的API
    在这里插入图片描述
    在这里插入图片描述
    你觉得哪种方式好?为什么?
    如果是业务类,推荐使用参数注入,因为可能会随时增加依赖其他类。
    如果是工具类,推荐使用setter注入,因为属性一般不会变动。
    构造器注入目前没有用过,最大的弊端是如果属性过多,构造器的参数列表会很长。

自动注入的注解对比

@Autowired:根据类型注入,Spring原生注解,可指定 required=false 来避免注入失败,配置 @Qualifier 指定名称。
@Resource:根据名称注入,JSR250规范,可通过type参数指定类型。
@Inject:根据类型注入,JSR330规范,需要导jar包,基本不用。

依赖注入4连问

依赖注入的目的和优点?
解耦,我们不再需要直接去 new 那些依赖的类对象,直接依赖会导致对象的创建机制、初始化过程难以统一控制。
依赖对象可配置,通过 xml 或者注解声明,可以指定和调整组件注入的对象,借助 Java 的多态特性,可以不需要大批量的修改就完成依赖注入的对象替换。
谁把什么注入给谁了?
IOC 容器把需要依赖的对象注入给待注入的组件。
依赖注入具体是如何注入的?
使用setter注入还是构造器注入?
推荐 setter 注入,理由是如果一个 Bean 有多个依赖时,构造器的参数列表会很长;而且如果 Bean 中依赖的属性不都是必需的话,注入会变得更麻烦。

Spring 框架中都用到了哪些设计模式

  • 代理模式:AOP 思想的底层实现技术,Spring 中采用 JDK Proxy 和 CgLib 类库。
  • 单例模式:在 Spring配置文件中定义的 bean 默认为单例模式。
  • 模板模式:用来解决代码重复的问题。比如:RestTemplate, JdbcTemplate。
  • 委派模式:Spring 提供了 DispatcherServlet 来对请求进行分发。
  • 工厂模式:BeanFactory 用来创建对象的实例,贯穿于 BeanFactory / ApplicationContext。

Bean的作用域

作用域类型概述
singleton一个 IOC 容器中只有一个【默认值】
prototype每次获取创建一个
request一次请求创建一个(仅Web应用可用)
session一个会话创建一个(仅Web应用可用)
application一个 Web 应用创建一个(仅Web应用可用)
websocket一个 WebSocket 会话创建一个(仅Web应用可用)

AOP

AOP思想的实现是基于代理模式 ,在JAVA中一般采用JDK动态代理模式,但是JDK动态代理模式
只能代理接口而不能代理类。所以Spring AOP 同时支持 CGLIB、JDK动态代理。
如果目标对象的实现类实现了接口,Spring AOP 将会采用 JDK 动态代理来生成 AOP 代理类。
如果目标对象的实现类没有实现接口,Spring AOP 将会采用 CGLIB 来生成 AOP 代理类。

概述BeanDefinition

BeanDefinition: Spring容器创建对象的图纸,一个对象对应一个图纸。
BeanFactoryPostProcessor: Spring容器创建对象,修改图纸。

BeanDefinition 描述了 IOC 容器中 bean 的元信息,它包含 bean 的类信息、属性、行为、依赖关系、配置信息等。BeanDefinition 具有层次性,并且可以在 IOC 容器初始化阶段被 BeanDefinitionRegistryPostProcessor 构造和注册,被 BeanFactoryPostProcessor 拦截修改等。

Spring使用注解注入属性为null的问题排查

保证Bean能够交付给Spring容器进行统一的管理:
1、先检查一下自己的Spring配置
2、组件上面是否加入了合适的注解。例如:@Controller,@Service, @Repository,@Component等
3、检查一下你context-scan扫描器配置的路径是否正确,即你的包扫描器是否能够扫描到你的注解组件

检查实例化的方式:
可能是获取对象的方式出错了。
当我们想要从中获取一个Bean的实例时,应该从Spring容器当中获取。
而如果我们自己new一个类的实例,便绕过了容器的依赖注入过程,因此也可能出现获取不到应有的属性这种情况。

检查注入的位置:
如果把@Autowired注解加在了一个静态属性上,也无法注入属性值。
Spring帮助我们做属性的自动注入,是在帮助我们实例化Bean之后完成的。而static属性标示该属性是归属于类而不是实例的。换句话说,当我们想给static属性注入值的时候,对象还没创建的。因此一定会出现注入为空的情况。

由于Bean初始化顺序导致的问题:
这种情况是在业务当中真实可能出现,并且并不好思考的地方。楼主遇到的场景是实现了一个Filter,在Filter当中需要注入业务层组件实现一些过滤逻辑。代码写完之后我发现ServerBean一直为空,我把上面三种方式可能出现问题的地方都做了检查也没有解决。后来Google了一下让我茅塞顿开。原来web容器启动是按照一定顺序的,即:Listener --> Filter -->Servlet。而我们的Service组件依赖与Servlet的Controller组件而创建,因此在创建Filter实例时,由于Servlet实例还没有初始化也会导致依赖无法注入的情况。

Spring全家桶 面试题总结 *Spring全家桶* *Spring:* 1、 *Spring是什么?* Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于****应用程序的开发****。 2、 *spring的作用?* Spring可以做很多事情,它为企业级开发提供了丰富的功能,方便解耦,简化开发,AOP编程支持,声明 阅读详情

相关推荐

Nordic开发者必备:SEGGER Embedded Studio免费许可证申请与配置全攻略

本文为Nordic芯片开发者提供了SEGGER Embedded Studio(SES)集成开发环境的详细配置指南。内容涵盖免费许可证的合规申请流程、项目创建、Nordic SDK集成,以及编辑器优化、构建调试配置、RTT日志输出等核心功能的高效设置,旨在帮助开发者构建深度优化的专业开发环境,显著提升嵌入式开发效率。

cheese的博客 353

Spring底层源码的理解和学习

面试之Spring底层篇

weixin_46460843的博客 595

第3章 信息技术服务(一)

对 第三章 《信息技术服务》中第一、二、三节 <内涵与外延、原理与组成、服务生命周期>进行总结、归纳

好好学习,天天向上的博客 733

Spring面试底层原理的那些问题,你是不是真的懂Spring?

1、什么是 Spring 框架?Spring 框架有哪些主要模块?Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring 框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成 Spring 框架,不必担心 Spring 是如何在后台进行工...

weixin_30663391的博客 3063

基于ABCDRez的激光谐振腔设计与热透镜效应仿真实践

本文详细介绍了如何利用ABCDRez代码包进行激光谐振腔设计与热透镜效应仿真。通过ABCD矩阵理论和高斯光束q参数,该工具能有效模拟热透镜动态变化对腔稳定性的影响,指导腔型优化与热补偿设计,是固体激光器预研与调试的高效辅助手段。

weixin_29093017的博客 290

加密视频如何破解 如何解除机器码绑定的视频

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 如何破解加密...

Q-980767270的博客 5万+

Spring 底层 面试题 超级详细

自己总结的脑图,下面是详细知识,如果对整个图片感兴趣的,评论区评论发高清图

Welcome to My blog 335

3.1 快速启动Flink集群

在本实战中,我们将快速启动Apache Flink 1.13.0集群,并在Hadoop集群环境中提交作业。首先,我们会在本地下载Flink安装包并上传至云主机,解压并配置环境变量。接着,我们将启动Flink集群,通过访问Web UI进行监控管理。然后,我们会配置集群,将Flink分发到从节点,并在集群上提交作业。最后,我们将通过命令行提交作业,并在Web UI上查看任务节点的输出结果。这个过程涵盖了Flink集群的部署、配置和作业提交,为大数据处理提供了一个完整的实战经验。

howard2005的专栏 727

拜托,面试请不要再问我Spring Cloud底层原理

结合真实业务场景,通过大量的手绘图,通俗易懂的谈谈Spring Cloud微服务架构的底层原理。

石杉的架构笔记 6万+

087、DAMO-YOLO Efficient-RepGFPN:重参数化加皇后融合加黄金分割的创新 Neck

DAMO-YOLO的Efficient-RepGFPN创新性Neck结构摘要: 该结构通过三重创新提升目标检测性能: 重参数化卷积:训练时多分支(3x3卷积+1x1卷积+BN分支)提升特征表达能力,推理时合并为单路3x3卷积保证效率; 皇后融合机制:采用可学习权重对不同尺度特征进行自适应加权融合,而非简单相加,通过Softmax归一化权重实现特征选择; 黄金分割连接:优化特征金字塔层间连接方式,按比例分配相邻层特征权重(如P3:P5≈0.618:0.382),减少冗余连接噪声。 实验表明,该结构有效解决了传

ai技术增长的博客 102

livox雷达斜装修改

指的是,使用外部的陀螺仪的话,雷达到外部陀螺仪的转换,而mid360的陀螺仪是内置在360里面的,且方向和点云方向是一致的,所以不能通过修改此处去改变陀螺仪方向。同时livox_ros_driver2中的MID360_config.json里面的。这里面的外参,只能改变点云相对陀螺仪的位姿,而不能将陀螺仪映射到你期望的倾斜角度。fast_lio中的mid360.yaml中的外参。

z1872385的博客 2709

SpringCloud微服务常见组件理解

概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring Cloud微服务架构的底层原理。 实际上,Spring Cloud是一个全家桶式的技术栈,包含了很多组件。本文先从其最核心的几...

2189

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

ChenJin_2的博客 276

spring面试题

什么是Spring IOC 容器控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。对于 IOC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。

weixin_42361347的博客 3696

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

spring面试题_spring mvc面试题_springboot面试题库

1、 Spring中的自动装配有哪些限制? 2、4个Spring常见面试题及答案解析 3、java面试题及答案2018Spring高频率面试题 4、Spring Bean 的加载过程 5、Spring Bean 的生命周期,如何被管理的 6、Spring Boot面试题总结 7、Spring Cloud Bus是什么? 8、Spring Cloud与Dub...

技术研究中心 6055

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring和MyBatis常见面试题总结

Before(前置通知):目标对象的方法调用之前触发After(后置通知):目标对象的方法调用之后触发(返回通知):目标对象的方法调用完成,在返回结果值之后触发(异常通知):目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。Around(环绕通知):编程式控制目标对象的方法调用。

夏日 の blog 3444

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring 面试题

spring 面试题

weixin_43725192的博客 815

Spring相关面试题

启动类使用`@SpringBootApplication`注解,包含`@Configuration`、`@EnableAutoConfiguration`、`@ComponentScan`等功能。Spring的Bean的作用域包括`singleton`(单例)、`prototype`(多例)、`request`、`session`、`application`、`websocket`等。而修改操作方法(如`save()`)会参与事务,可以通过`@Transactional`注解管理事务。

坚持写博客,大家的关注是我前进的动力! 507

2025春招,Spring 面试题汇总

大家好,我是 V 哥。2025年金三银四春招马上进入白热化,兄弟们在即将到来的假期,除了吃喝欢乐过新年,想年后跳槽升职的兄弟也要做好充分的准备,要相信,机会永远只留给有准备的人。以下是一份2025年春招Spring面试题汇总,送给大家,关于 Java 基础相关的请移步 V 哥上一篇文章《【长文收藏】2025备战金三银四 J...

cnzzs的博客 1023

Spring Boot 常用注解面试题深度解析

Spring Boot 常用注解面试题深度解析

感谢阅读 5829

【Spring面试题(35道)】

Spring面试题35道,包含Spring介绍、哪些模块、常用注解、用到的设计模式;IOC容器介绍、实现机制、Spring Bean生命周期、依赖注入、自动装配的方式、单例Bean线程安全问题、怎么解决循环依赖等;AOP介绍、JDK与CGLIB动态代理;Spring中的事务种类、传播机制、声明式事务实现原理;Spring MVC核心组件、工作流程、Restful风格的接口流程设计;Spring Boot有哪些优点、启动的原理;Spring Cloud 的核心组件、解决什么问题、流行的微服务框架。

独上高楼,望尽天涯路。 2472

java面试题spring_java开发面试题:spring面试题总结

今天分享的java实习生常见面试题,是spring专场,主要是针对spring总结的面试题,有需要的小伙伴可以收入囊中了!​1、 Spring Framework 中有多少个模块,它们分别是什么?Spring 核心容器 – 该层基本上是 Spring Framework 的核心。它包含以下模块:Spring CoreSpring BeanSpEL (Spring Expression Langua...

weixin_36199904的博客 335

精尽 Spring 面试题

以下面试题,基于网络整理,和自己编辑。具体参考的文章,会在文末给出所有的链接。 如果胖友有自己的疑问,欢迎在星球提问,我们一起整理吊吊的 Spring 面试题的大保健。 而题目的难度,艿艿尽量按照从容易到困难的顺序,逐步下去。 注意 1 ,这个面试题,暂时不包括 Spring MVC 部分。主要以 Spring IoC、Spring AOP、Spring Transaction 为主。 ...

weixin_34279246的博客 1850

spring的15个经典面试题

于是很多Java Web开发相关的MVC框架应运而生,比如Struts2,但是由于Struts2比较笨重,随着Spring轻量级开发框架的流行,Spring生态圈出现了Spring MVC框架。我们需要增加新功能也方便,提高了系统的扩展性。AOP(Aspect-Oriented Programming,面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性。

m0_54850303的博客 1034
上一篇: SpringBoot 之源码分析
下一篇: SpringBoot 之解决跨域请求问题
yyangqqian
博客等级 码龄15年 406粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值