说实话,面试这么问Spring框架的问题,我快扛不住了

article/2025/9/25 9:23:49

面试官:Spring Framework有用过吧?

小小白:用过(有些心虚,因为Spring框架中内容太多了)。

面试官:在applicationgContext.xml文件中定义了一个bean,id为authService,通过ApplicationContext实例对象的getBean方法获取到这个bean,这个背后的实现原理是什么?

小小白:(心想得谨慎回答,因为可能会把自己带进坑里)Spring容器启动的时候会解析applicationgContext.xml,将xml中定义的bean(如authService)解析成Spring内部的BeanDefinition,并以beanName(如authService)为key,BeanDefinition(如authService相应的BeanDefinition)为value存储到DefaultListableBeanFactory中的beanDefinitionMap属性中(其实它就是一个ConcurrentHashMap类型的属性),同时将beanName存入beanDefinitionNames中(List类型),然后遍历beanDefinitionNames中的beanName,进行bean的实例化并填充属性,在实例化的过程中,如果有依赖没有被实例化将先实例化其依赖,然后实例化本身,实例化完成后将实例存入单例bean的缓存中,当调用getBean方法时,到单例bean的缓存中查找,如果找到并经过转换后返回这个实例(如AuthService的实例),之后就可以直接使用了。

面试官:说一下xml文件的解析过程?

小小白:代码中指定要加载的xml文件后,Spring容器初始化的过程中,通过ResourceLoader接口实现类,例如ClassPathXmlApplicationContext,将xml文件路径转换成对应的Resource文件,例如ClassPathResource,然后通过DocumentLoader对Resource文件进行转换,转换成Document文件,接着通过DefaultBeanDefinitionDocumentReader对Document进行解析,并使用BeanDefinitionParserDelegate对元素进行解析,解析xml中bean定义的各个元素,存入BeanDefinition中。

面试官:那你再详细说一下这个BeanDefinition是什么?

小小白:一个对象的生命周期要想被Spring容器管理,那么它的类信息必须先转成Spring内部的数据结构,BeanDefinition就是Spring框架内部用来描述对象的类信息的数据结构。例如类名、scope、属性、构造函数参数列表、依赖的bean、是否是单例类、是否是懒加载等,其实就是将Bean的定义信息存储到这个BeanDefinition相应的属性中,后面对Bean的操作就直接对BeanDefinition进行,例如拿到这个BeanDefinition后,可以根据里面的类名、构造函数、构造函数参数,使用反射进行对象创建。BeanDefinition是一个接口,是一个抽象的定义,实际使用的是其实现类,如ChildBeanDefinition、RootBeanDefinition、GenericBeanDefinition等。BeanDefinition继承了AttributeAccessor,说明它具有处理属性的能力;BeanDefinition继承了BeanMetadataElement,说明它可以持有Bean元数据元素,作用是可以持有XML文件的一个bean标签对应的Object。

面试官:刚刚你有说到DefaultListableBeanFactory,它在Spring框架中的作用是什么?

小小白:DefaultListableBeanFactory是整个Bean加载的核心部分,是Spring注册及加载Bean的默认实现。DefaultListableBeanFactory间接实现了BeanFactory接口,而在BeanFactory接口中定义了很多和bean操作相关的方法,例如getBean、containsBean、isSingleton等,所以DefaultListableBeanFactory也相应持有了这些操作。

面试官:那BeanFactory又是什么?

小小白:BeanFactory是用于访问Spring Bean容器的根接口,是一个单纯的Bean工厂,也就是常说的ioc容器的顶层定义,各种ioc容器是在其基础上为了满足不同需求而扩展的,包括经常使用的ApplicationContext。

面试官:如何理解BeanFactory和FactoryBean?

小小白:BeanFactory定义了ioc容器的最基本形式,并提供了ioc容器应遵守的的最基本的接口,也就是Spring ioc所遵守的最底层和最基本的编程规范,它只是个接口,并不是ioc容器的具体实现。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。再来说说FactoryBean,一般情况下,Spring通过反射机制利用bean的class属性实例化Bean,然而在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在bean的定义中提供大量的配置信息,而配置这种方式的灵活性是受限的,这时采用编码的方式可能会是一个比较合适的方案,Spring为此提供了FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。

面试官:如果想在初始化前修改bean的属性,如何实现?

小小白:自定义一个BeanFactoryPostProcessor,让它实现BeanFactoryPostProcessor接口,并实现postProcessBeanFactory方法,在这个方法中可以在初始化前修改bean的属性。

面试官:这个自定义的BeanFactoryPostProcessor是如何自动调用的?

小小白:在Spring容器初始化的过程中会自动触发,具体代码在AbstractApplicationContext类中会调用invokeBeanFactoryPostProcessors方法,在这个方法中筛选出所有实现BeanFactoryPostProcessor接口的类名称,然后遍历调用这些实现类的postProcessBeanFactory方法。

面试官:如果想在bean被初始化时进行拦截,进行额外初始化操作,如何实现?

小小白:自定义BeanPostProcessor,让它实现BeanPostProcessor接口,在这个接口中定义了两个方法:postProcessBeforeInitialization和postProcessAfterInitialization。postProcessBeforeInitialization方法会在afterPropertiesSet和自定义的初始化方法之前执行,通过实现这个方法,在方法的内部进行初始化之前的额外操作。postProcessAfterInitialization方法会在afterPropertiesSet和自定义的初始化方法之后执行,通过实现这个方法,在方法的内部进行初始化之后的额外操作。

面试官:在Spring容器初始化的过程中,所有定义的bean都会被初始化吗?

小小白:不是,默认只初始化所有未初始化的非懒加载的单例Bean,scope为其它值的bean会在使用到的时候进行初始化,如prototype。

面试官:有看过Spring中bean初始化的源码吗?

小小白:看过,单例bean的初始化,通过反射进行实例对象的创建,在进行属性填充时,如果依赖的对象没有创建,则先创建依赖对象,最后将bean实例加入单例bean实例的缓存中。

面试官:在bean实例化的过程中,Spring是如何解决循环依赖的?

小小白:Spring只对单例bean的循环依赖进行了解决,同时如果是通过构造函数注入造成的循环依赖,Spring也没有办法解决,只是抛出BeanCurrentlyInCreationException异常。如果是通过setter方式注入而产生的循环依赖,Spring在创建bean对象时,通过提前暴露一个ObjectFactory用来返回一个创建中的bean对象,从而使其它bean能够引用到这个bean。

面试官:Spring框架中用到了哪些设计模式?

小小白:......额.....


推荐阅读

没使用加号拼接字符串,面试官竟然问我为什么

面试官一步一步的套路你,为什么SimpleDateFormat不是线程安全的

都说ThreadLocal被面试官问烂了,可为什么面试官还是喜欢继续问

Java注解是如何玩转的,面试官和我聊了半个小时

如何去除代码中的多次if而引发的一连串面试问题

三分钟快速搞定git常规使用

String引发的提问,我差点跪了

就写了一行代码,被问了这么多问题

面试官:JVM对锁进行了优化,都优化了啥?

synchronized连环问

深入Spring Boot (十三):整合Kafka详解

深入理解Spring系列之十五:@Async实现原理

点点"在看" 呗


http://chatgpt.dhexx.cn/article/WdI5S8R4.shtml

相关文章

【java面试】框架篇之Spring

1.你如何理解Spring? 具体来说Spring是一个轻量级的容器,用于管理业务相关对象的。核心功能主要为:IOC,AOP,MVC。 IOD:控制反转,将对象的创建过程交给容器,让容器管理对象的生命周期如创建,初始化&#…

spring框架-如何面试(四)

回顾: spring框架-认识spring框架(一) spring框架-认识IOC(二) spring框架-认识AOP(三) 面试官关于spring最喜欢、也是概率最大的提问 谈谈你对spring的理解 spring的官方定义:…

Spring框架面试题总结(面试必备)

1. spring 概述部分 1.1 什么是spring? 1.2 spring框架的核心? 1.3 spring框架的优缺点 1.4 spring5 的主要模块构成 1.5 Spring 框架中都用到了哪些设计模式? 1.6 讲解一下核心容器(spring context应用上下文) 模块 2. spring的控制反转&#xff08…

cmos管宽长比,OC, OD门和线与逻辑,传输门,竞争冒险,三态门

https://blog.csdn.net/vivid117/article/details/100187137 pmos,nmos宽长比https://blog.csdn.net/qq_34070723/article/details/89291200 cmos宽长比: 1.CMOS的宽长比 关于COMS原理及结构图可以参考[1]COMS原理及门电路设计. 栅在源漏方向的长度称作栅的长L&…

OD门OC门

什么是集电极开路(OC)? % {0 V: X2 {1 I2 s E( y; n! S 我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用…

最强深入浅出上拉、OC门、OD门 —— 电子电路基础2

写在前面:对于本科阶段数电课程课时比较少的学校,这一块老师很可能就跳过了,对于这一块的知识来源,清华大学阎石的数电课本在第三章CMOS门电路和TTL门电路。 先看一些电路; (1)为什么有些时候单…

女朋友去应聘硬件工程师,面试官考她OC门、OD门和推挽输出!

硬件工程师的笔试题中经常会考OC门和OD门,有的放在面试中问,多个OC或者多个OD门能组成线与结构,线与结构考的更频繁,还有一个推挽输出,有一些单片机的GPIO用的就是这种结构,如最常见的STM32。 原创博主AirC…

OC门、OD门和推挽输出

1. OC门 OC意为集电极开路,结构如下: OC门电路 A0,①截止,②导通,相当于开关闭合,输出0V(实际输出不是0V,因为三极管存在饱和压降)。 A1,①导通&#xff0…

线与逻辑与OC门、OD门关系

线与逻辑:两个或多个输出信号连接在一起可以实现逻辑“与”的功能。 以下图为例: 当与非门G1和G2输出都为1时,输出L才为1;只要有一个输出为0,则输出L为0。 在硬件上,要用OC门(三极管,集电极开路)或OD门(NMOS,漏极开路)来实现。另外,为了防止灌电流过大,在输出端…

数字电路基础知识——CMOS门电路 (与非门、或非、非门、OD门、传输门、三态门)

数字电路基础知识——CMOS门电路 (非门、或非门、与非门、或门、与门、与或非门、异或门、OD门、传输门、三态门) 先了解二极管门电路逻辑,再次介绍CMOS门电路,也是IC中用的最广泛的门电路。 主要了解与非门、或非门以及相同面积的cmos与非门和或非门哪个…

CMOS门电路(OD门、传输门、双向模拟开关、三态门)

文章目录 【 1. MOS管】【 2. CMOS电路】电路结构拉电流灌电流 【 3. 多余输入端的处理】【 4. 扇出系数】【 5. 输入噪声容限】提高噪声容限的方法 【 6. 电压、电流的传输特性】【 7. 静态输入、输出特性】静态输入特性静态输出特性 【 8. 动态特性】①传输延迟时间②交流噪声…

OC门与OD门以及线与逻辑

OC(Open Collector)门又叫集电极开路门,主要针对的是BJT电路(从上往下依次是基极,集电极,发射极)OD(Open Drain)门又叫漏极开路门,主要针对的是MOS管&#xf…

OC门电路和OD门电路的区别

OC门电路和OD门电路的区别 一、OC门电路是什么?二、OD门电路是什么?三、总结 一、OC门电路是什么? OC门电路:集电极开路(open collector) OC门电路的工作原理: 1)当INPUT输入高电平…

CMOS搭建反相器、与非门和或非门以及OD和三态门

文章目录 基本概念1. N沟道增强型MOS管2. P沟道增强新MOS管 反相器与非门或非门OD门和三态门1.OD门2.三态门 基本概念 CMOS(互补对称式金属-氧化物-半导体电路),具有源极(S)、栅极(G)和漏极&am…

OC门、OD门与推挽输出

硬件工程师的笔试题中经常会考OC门和OD门,有的放在面试中问,多个OC或者多个OD门能组成线与结构,线与结构考的更频繁,还有一个推挽输出,有一些单片机的GPIO用的就是这种结构,如最常见的STM32。 原创博主&…

OD OC 门

在电路中常会遇到漏极开路(Open Drain)和集电极开路(Open Collector)两种情形。漏极开路电路概念中提到的“漏”是指 MOSFET的漏极。同理,集电极开路电路中的“集”就是指三极管的集电极。在数字电路中,分别…

数字电路2. OC门、OD门、三态门

数字电路2. OC门、OD门、三态门 一、OC门——集电集开路门1. 基本概念2. 作用3. 使用要点4. OC门的简单实现 二、OD门——漏极开路门四、三态门1. 概念2. 三态门的作用3. 简单仿真(1)1使能高电平(2)1使能低电平 一、OC门——集电集…

OC, OD门和线与逻辑

OC(Open Collector)门,又称集电极开路,OD(Open Drain)漏极开路,通过名称就可以判断,OC门是针对三极管来说的,而OD门是针对MOS管而言的,csdn上有很多人把OC门就…

理一理 OC/OD 门、开漏输出、推挽输出等一些相关概念

电子设计基础知识,讲一讲OC/OD门,开漏/推挽输出,以及图腾柱 ... 矜辰所致目录 前言一、OC/OD 门1.1 OC 门1.2 OD 门1.3 电路说明1.4 应用 二、开漏/推挽输出2.1 开漏输出2.2 推挽输出2.3 图腾柱 结语 前言 前几天有小伙伴问我能不能讲讲开…

OC门和OD门

OC门和OD门 OC:集电极开路(Open Collector) OD:漏极输出(Open Drain) OC门和OD门是相对于两个器件而言的,OC门是对三极管而言,OD门是对场效应管而言。 OC门电路如下所示&#xff0c…