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

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

内容简介:面试官: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 框架的问题,我快扛不住了

点点" 在看 " 呗


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

查看所有标签

猜你喜欢:

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

Uberland

Uberland

Alex Rosenblat / University of California Press / 2018-11-19 / GBP 21.00

Silicon Valley technology is transforming the way we work, and Uber is leading the charge. An American startup that promised to deliver entrepreneurship for the masses through its technology, Uber ins......一起来看看 《Uberland》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具