公众号|松花皮蛋的黑板报|Spring Boot框架中必须了解的知识点
松花皮蛋的黑板报
  • 分享在京东工作的技术感悟,还有JAVA技术和业内最佳实践,大部分都是务实的、能看懂的、可复现的

扫一扫
关注公众号

Spring Boot框架中必须了解的知识点

博客首页文章列表 松花皮蛋me 2020-03-29 15:45

1、核心模块包括哪些?


(1)、spring-core:Spring基础API模块,如资源管理、泛型处理。(2)、spring-beans:Spring Bean相关,如依赖查找、依赖注入。(3)、spring-aop: Spring Aop处理相关,如动态代码、AOP字节码提升。(4)、spring-context:事件驱动、注解驱动、模块驱动等。(5)、spring-expression: Spring表达式语言模块。


2、什么是IoC?


Ioc是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入实现。其中,Spring作为IoC容器有如下优势:AOP抽象、事务抽象、事件扩展、SPI扩展、强大的第三方整合、易测试性、更好的面向对象


3、依赖查找和依赖注入的区别?


依赖查找是主动或者手动的依赖查找方式,通常需要依赖容器或标准API实现,比如BeanFactory#getBean、ObjectFactory#getObject、ObjectProvider#getIfAvailable、ListableBeanFactory#getBeansOfType查找。而依赖注入则是手动或者自动依赖绑定的方式,无需依赖特定的容器和API,比如@AutoWired注入、@Inject注入、@Resource注入。另外,类型注入的时候会触发类型转换,比如文件路径字符串转成资源。


其中,依赖注入的方式有构造器注入、Setter注入、字段注入、方法注入、接口回调注入(Aware系列接口注入)。常见的是构造器和Setter注入,他们的区别如下:


构造器注入可以保证依赖的对象不为空,能确保每个对象都有一个初始状态并且是不可变的,但是要避免过多的构造参数。


Setter注入一般用于可选性的依赖注入,它还可以设置默认值,它的缺点是无序性。


4、BeanFactory与FactoryBean的区别?


BeanFactory是IoC底层容器,而FactoryBean是创建Bean的一种方式,它帮助实现复杂的初始化逻辑。


5、Spring Ioc容器启动时做了哪些准备?


IoC配置元信息读取和解析、容器生命周期、Spring事件发布、国际化等。


6、如何注册一个Spring Bean?


通过BeanDefinition和外部单体对象来注册。具体的方式有XML配置元信息、JAVA注解配置元信息、API配置元信息。需要注意的是,如果同时使用多种方式进行初始化或者销毁操作,那么优先级规律为:JDK原生注解优先,框架内建钩子次之,最后才是自定义实现。


7、什么是Spring BeanDefinition?


BeanDefinition是定义Bean的配置元信息接口,包括类名、行为配置元素(作用域Scope、自动绑定的模式、延迟初始模式、生命周期回调)、其他合作者或者依赖的Bean的引用、PropertyValues属性设置。我们可以通过BeanDefinitionBuilder、AbstractBeanDefinition以及派生类来构建BeanDefinition,它并非Bean最终的状态,还可以自定义修改。


8、ObjectFactory与BeanFactory的区别?


他们都提供了依赖查找的能力。不过ObjectFactory仅关注一个或一种类型的Bean依赖查找,并且自身不具备依赖查找的能力,能力由BeanFactory输出。BeanFactory则提供了单一类型、集合类型以及层次性等多种依赖查找方式。需要注意的是,通过类型判断bean可能导致bean提前初始化,产生不确定的因素。


9、BeanFactory#getBean是否为线程安全?


依赖查找过程是线程安全的,过程中会增加互斥锁。


10、依赖注入的来源有哪些?


依赖注入的来源包括:Spring BeanDefinition、单例对象(beanFactory.registerSingleton)、非Spring容器管理对象(beanFactory.registerResolvableDependency)、@Value标注的外部化配置作为依赖来源。


实际上,依赖注入和依赖查找的来源是不一样的,依赖查找的来源仅限于Spring BeanDefinition以及单例对象,也就是我们无法通过getBean进行依赖查找获取BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext对象,而依赖注入则是可以的。


11、单例对象在IOC容器启动后是否还可以继续注册?


单例对象的注册与BeanDefinition不同,BeanDefinition会被ConfigurableListableBeanFactory#freezeConfiguration方法影响,从而冻结注册,单例对象则没有这个限制。


12、singleton Bean是否在一个应用是唯一的?


singleton bean仅在当前Spring Ioc容器中是单例对象。


13、BeanPostProcessor的使用场景有哪些?


BeanPostProcessor提供Spring Bean初始化前和初始化后的生命周期回调,分别对应postProcessBeforeInitialization以为postProcessAfterInitalization方法,允许对关心的Bean进行扩展,甚至是替换。其中,ApplicationContext相关的Aware回调也是基于BeanPostProcessor实现,即ApplicationContextAwareProcessor。


14、BeanFactoryPostProcessor与BeanPostProcessor的区别?


BeanFactoryPostProcessor是ConfigurableListableBeanFactory的后置处理器,用于扩展BeanFactory,或者通过BeanFactory进行依赖查找和依赖注入。其中BeanFactoryPostProcessor必须有Spring ApplicationContext执行,BeanFactory无法与其直接交互。而BeanPostProcessor则直接与BeanFactory关联,属于N对1的关系。


15、BeanFactory是怎样处理Bean生命周期的?


BeanFactory的默认实现为DefaultListableBeanFactory,其中Bean生命周期与方法映射如下:

  • (1)、BeanDefinition注册阶段-registerBeanDefinition
  • (2)、BeanDefinition合并阶段-getMergedBeanDefinition
  • (3)、Bean实例化前阶段-resolveBeforeInstantiation
  • (4)、Bean实例化阶段-createBeanInstance
  • (5)、Bean实例化后阶段-populateBean
  • (6)、Bean属性赋值前阶段-populateBean
  • (7)、Bean属性赋值阶段-populateBean
  • (8)、Bean Aware接口回调阶段-initializeBean
  • (9)、Bean初始化前阶段-initializeBean
  • (10)、Bean初始化阶段-initializeBean
  • (11)、Bean初始化后阶段-initializeBean
  • (12)、Bean初始化完成阶段-preInstantiateSingletons
  • (13)、Bean销毁前阶段-destoryBean
  • (14)、Bean销毁阶段-destoryBean

16、Spring配置元信息具体有哪些分类

  • (1)、Bean配置元信息:通过媒介,如XML、Properties等,解析BeanDefinition。
  • (2)、IoC容器配置元信息:通过媒介,如XML、Properties等,控制IoC容器行为,比如注解驱动、AOP等。
  • (3)、外部化配置:通过资源抽象,如Properties、YAML等,控制PropertySource。
  • (4)、Spring Profile: 通过外部化配置,提供条件分支流程。


17、扩展Spring XML元素方法的缺点


高复杂度、嵌套元素支持较弱、XML处理性能较差、XML框架移植性差。