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

栏目: IT技术 · 发布时间: 4年前

内容简介:面试官:Spring Framework有用过吧?小小白:用过(有些心虚,因为Spring框架中内容太多了)。

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

面试官: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实现原理

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

点点" 在看 " 呗


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java语言程序设计

Java语言程序设计

(美) Y. Daniel Liang / 李娜 / 机械工业出版社 / 2011-6 / 79.00元

本书是Java语言的经典教材,畅销多年不衰。本书全面整合了Java的特性,采用“先讲基础”的教学方式,循序渐进地介绍了程序设计基础、面向对象程序设计、GUI程序设计等。另外,本书还全面且深入地覆盖了一些高级主题,包括算法和数据结构、并发、网络、国际化、高级GUI、数据库和Web程序设计等。 本书中文版由《Java语言程序设计 基础篇》和《Java语言程序设计 进阶篇》组成。基础篇对应原书的第......一起来看看 《Java语言程序设计》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具