23

公众号|松花皮蛋的黑板报|Spring Boot框架中必须了解的知识点

 4 years ago
source link: http://www.liangsonghua.com/archives/1270?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

博客首页文章列表 松花皮蛋me 2020-03-29 15:45
feather-4970565_1280-1024x675.jpg

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框架移植性差。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK