SpringBoot面试
大纲

前置知识
ApplicationContextInitializer
SpringBoot框架在设计之初,为了有更好的兼容性,在不同的运行阶段,提供了非常多的扩展点, 可以让程序员根据自己的需求, 在整个Spring应用程序运行过程中执行程序员自定义的代码。

IOC容器对象创建完成后执行,可以对上下文环境做一些操作, 例如运行环境属性注册等
ApplicationContextInitializer如何使用?
- 自定义类,实现ApplicationContextInitializer接口
- 在META-INF/spring.factories配置文件中配置自定义的类
initialize方法什么时候执行?
IOC容器对象创建完成后执行, 常用于环境属性注册
ApplicationListener
监听容器发布的事件, 允许程序员执行自己的代码,完成事件驱动开发, 它可以监听容器初始化完成、初始化失败等事件. 通常情况下可以使用监听器加载资源,开启定时任务等
使用方法
- 自定义类,实现ApplicationListener接口
- 在META-INF/spring.factories配置文件中配置自定义的类
BeanFactory
Bean容器的根接口, 提供Bean对象的创建、配置、依赖注入等功能



BeanFactory常见的两个实现?
- ApplicationConfigServletServerApplicationContext
- DefaultListableBeanFactory
BeanDefinition
用于描述Bean,包括Bean的名称,Bean的属性,Bean的行为,实现的接口,添加的注解等等,Spring中,Bean在创建之前,都需要封装成对应的BeanDefinition,然后根据BeanDefinition进一步创建Bean对象。


BeanFactoryPostProcessor
Bean工厂后置处理器,当BeanFactory准备好了后(Bean初始化之前),会调用该接口的postProcessBeanFactory方法,经常用于新增BeanDefinition

Aware
感知接口,Spring提供的一种机制,通过实现该接口,重写方法,可以感知Spring应用程序执行过程中的一些变化。Spring会判断当前的Bean有没有实现Aware接口,如果实现了,会在特定的时机回调接口对应的方法。

InitializingBean/DisposableBean
- 初始化接口,当Bean被实例化好后,会回调里面的函数,经常用于做一些加载资源的工作
- 销毁接口,当Bean被销毁之前,会回调里面的函数,经常用于做一些释放资源的工作
BeanPostProcessor
Bean的后置处理器,当Bean对象初始化之前以及初始化之后,会回调该接口对应的方法。
面试题
SpringBoot启动流程
new SpringApplication()
- 确认web应用的类型
- 加载ApplicationContextInitializer
- 加载ApplicationListener
- 记录主启动类
run()
- 准备环境对象Environment,用于加载系统属性等等
- 打印Banner
- 实例化容器Context
- 准备容器,为容器设置Environment、BeanFactoryPostProcessor,并加载主类对应的BeanDefinition
- 刷新容器(创建Bean实例)
- 返回容器

总结
总: SpringBoot启动,其本质就是加载各种配置信息,然后初始化IOC容器并返回
分:在其启动的过程中会做这么几个事情 首先,当我们在启动类执行SpringApplication.run这行代码的时候,在它的方法内部其实会做两个事情
-
创建SpringApplication对象;
-
执行run方法。
其次,在创建SpringApplication对象的时候,在它的构造方法内部主要做3个事情。
-
确认web应用类型,一般情况下是Servlet类型,这种类型的应用,将来会自动启动一个tomcat
-
从spring.factories配置文件中,加载默认的ApplicationContextInitializer和ApplicationListener
-
记录当前应用的主启动类,将来做包扫描使用
最后,对象创建好了以后,再调用该对象的run方法,在run方法的内部主要做4个事情
-
准备Environment对象,它里面会封装一些当前应用运行环境的参数,比如环境变量等等
-
实例化容器,这里仅仅是创建ApplicationContext对象
-
容器创建好了以后,会为容器做一些准备工作,比如为容器设置Environment、BeanFactoryPostProcessor后置处理器,并且加载主类对应的Definition
-
刷新容器,就是我们常说的referesh,在这里会真正的创建Bean实例
总:总结一下我刚说的,其实SpringBoot启动的时候核心就两步,创建SpringApplication对象以及run方法的调用,在run方法中会真正的实例化容器,并创建容器中需要的Bean实例,最终返回
IOC容器初始化流程
AbstractApplicationContext.refresh()
- 准备BeanFactory(DefaultListableBeanFactory)
设置ClassLoader
设置Environment - 扫描要放入容器中的Bean,得到对应的BeaDefinition(只扫描,并不创建)
- 注册BeanPostProcessor
- 处理国际化
- 初始化事件多播器ApplicationEventMulticaster
- 启动tomcat
- 绑定事件监听器和事件多播器
- 实例化非懒加载的单例Bean
- 扫尾工作,比如清空实例化时占用的缓存等

总结

Bean生命周期



总结

Bean循环依赖



总结

SpringMVC执行流程


总结
