Spring Framework常用面试题及答案汇总
1.什么是SpringFramework?
SpringFramework是一个提供了完整性的编程或配置一个现代化的基于JAVA的企业应用,各种基础设施的支持。
参见官方(https://spring.io/projects/spring-framework#overview):
TheSpringFrameworkprovidesacomprehensiveprogrammingandconfigurationmodelformodernJava-basedenterpriseapplications-onanykindofdeploymentplatform.
SpringmakesiteasytocreateJavaenterpriseapplications.ItprovideseverythingyouneedtoembracetheJavalanguageinanenterpriseenvironment,withsupportforGroovyandKotlinasalternativelanguagesontheJVM,andwiththeflexibilitytocreatemanykindsofarchitecturesdependingonanapplication'sneeds.AsofSpringFramework5.1,SpringrequiresJDK8+(JavaSE8+)andprovidesout-of-the-boxsupportforJDK11LTS.JavaSE8update60issuggestedastheminimumpatchreleaseforJava8,butitisgenerallyrecommendedtousearecentpatchrelease.
2.SpringFramework有哪些核心模块?
- spring-context:事件驱动,注解驱动,模块驱动等
- spring-core:Spring基础API模块,如资源管理、泛型处理
- spring-beans:SpringBean相关,如依赖查找、依赖注入
- spring-aop:SpringAOP处理,如动态代理、AOP字节码提升
- spring-expression:Spring表达式语言模块
(项目使用Maven进行管理时,引入spring-context模块后,则会传递依赖加载其他4个模块)
3.什么是IOC?
IOC是控制反转,类似于好莱坞原则(你不要打电话给我,我会打电话给你),主要包含依赖查找和依赖注入
4.依赖注入和依赖查找的区别?
依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准API实现。而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和API
5.Spring作为IOC容器的优势有哪些?
典型的IOC容器管理,依赖注入、依赖查找
- AOP抽象
- 事物抽象
- 事件机制
- SPI扩展
- 强大的第三方整合
- 易测试性等
6.Spring中BeanFactory和FactoryBean区别?
BeanFactory是IOC底层容器
FactoryBean是创建Bean的一种方式,帮助实现复杂的初始化逻辑
7.Spring中BeanFactory和ObjectFactory区别?
ObjectFactory和BeanFactory均提供依赖查找的能力;
ObjectFactory仅关注一个或一种类型的Bean的依赖查找,并且自身不具备依赖查找的能力,能力则由BeanFactory输出;
BeanFactory则提供了单一类型、集合类型以及层次性等多种依赖查找方式;
8.BeanFactory.getBean操作是否线程安全?
BeanFactory.getBean方法的执行是线程安全的,操作过程中会增加互斥锁.
9.Spring有多少种依赖注入的方式?
- 构造器注入
- Setter方法注入
- 字段注入
- 方法注入
- 接口回调注入
10.Spring偏好构造器注入还是Setter注入?
两种依赖注入方式均可以使用,如果是必须依赖的话,推荐使用构造器注入,Setter注入用于可选依赖
11.Spring注入和依赖来源是否相同?
不相同,依赖查找的来源仅限于SpringBeanDefinition以及单例对象;依赖注入的来源还包括ResolvableDependency以及@Value所标注的外部化配置
12.单例对象能在Ioc容器启动后注册吗?
可以的,单例对象的注册于BeanDefinition不同,BeanDefinition会被ConfigurableListableBeanFactory#freezeConfiguration()方法影响,从而冻结注册,单例对象则没有这个限制
13.Spring依赖注入的来源有哪些?
SpringBeanDefinition
单例对象
ResolvableDependency
@Value外部化配置
14.Spring内建的Bean作用域有几种?
- singleton--默认单例☆
- prototype--原型
- request--Web中使用
- session
- application
- websocket
15.Spring中singletonBean是否在一个应用中是唯一的?
否,singletonbean仅在当前SpringIoC容器(BeanFactory)中是单例对象;而BeanFactory可能存在父容器
16.Spring中BeanPostProcessor的使用场景有哪些?
Spring中BeanPostProcessor提供SpringBean初始化前和初始化后的生命周期回调;分别对应postProcessBeforeInitialization以及postProcessAfterInitialization方法,允许对关心的Bean进行扩展,甚至替换。
其中ApplicationContext相关的Aware回调也是基于BeanPostProcessor实现,即ApplicationContextAwareProcessor
17.Spring中BeanFactoryPostProcessor与BeanPostProcessor的区别?
BeanFactoryPostProcessor是SpringBeanFactory(实际为ConfigureableListableBeanFactory)的后置处理器,用于扩展BeanFactory,或通过BeanFactory进行依赖查找或依赖注入;
BeanFactoryPostProcessor必须有SpringApplicationContext执行,BeanFactory无法与其直接交互;
BeanPostProcessor则直接与BeanFactory关联,属于N对1的关系。
18.Spring中BeanFactory是如何处理Bean的生命周期?
BeanFactory的默认实现为DefaultListableBeanFactory,其中Bean生命周期与方法映射如下:
- BeanDefinition注册阶段--registerBeanDefinition
- BeanDefinition合并阶段--getMergedBeanDefinition
- Bean实例化前阶段--resolveBeforeInstantiation
- Bean实例化阶段--createBeanInstance
- Bean实例化后阶段--populateBean
- Bean属性赋值前阶段--populateBean
- BeanAware接口回调阶段--initializeBean
- Bean初始化前阶段--initializeBean
- Bean初始化阶段--initializeBean
- Bean初始化后阶段--initializeBean
- Bean初始化完成阶段--preInstantiateSingletons
- Bean销毁前阶段--destroyBean
- Bean销毁阶段--destroyBean
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。