SpringBoot面试篇

SpringBoot面试

大纲

前置知识

ApplicationContextInitializer

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

IOC容器对象创建完成后执行,可以对上下文环境做一些操作, 例如运行环境属性注册等

ApplicationContextInitializer如何使用?

  • 自定义类,实现ApplicationContextInitializer接口
  • 在META-INF/spring.factories配置文件中配置自定义的类

initialize方法什么时候执行?

IOC容器对象创建完成后执行, 常用于环境属性注册

ApplicationListener

监听容器发布的事件, 允许程序员执行自己的代码,完成事件驱动开发, 它可以监听容器初始化完成、初始化失败等事件. 通常情况下可以使用监听器加载资源,开启定时任务等

使用方法

  1. 自定义类,实现ApplicationListener接口
  2. 在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()
  1. 确认web应用的类型
  2. 加载ApplicationContextInitializer
  3. 加载ApplicationListener
  4. 记录主启动类
run()
  1. 准备环境对象Environment,用于加载系统属性等等
  2. 打印Banner
  3. 实例化容器Context
  4. 准备容器,为容器设置Environment、BeanFactoryPostProcessor,并加载主类对应的BeanDefinition
  5. 刷新容器(创建Bean实例)
  6. 返回容器
总结

总: SpringBoot启动,其本质就是加载各种配置信息,然后初始化IOC容器并返回

分:在其启动的过程中会做这么几个事情 首先,当我们在启动类执行SpringApplication.run这行代码的时候,在它的方法内部其实会做两个事情

  1. 创建SpringApplication对象;

  2. 执行run方法。

其次,在创建SpringApplication对象的时候,在它的构造方法内部主要做3个事情。

  1. 确认web应用类型,一般情况下是Servlet类型,这种类型的应用,将来会自动启动一个tomcat

  2. 从spring.factories配置文件中,加载默认的ApplicationContextInitializer和ApplicationListener

  3. 记录当前应用的主启动类,将来做包扫描使用

最后,对象创建好了以后,再调用该对象的run方法,在run方法的内部主要做4个事情

  1. 准备Environment对象,它里面会封装一些当前应用运行环境的参数,比如环境变量等等

  2. 实例化容器,这里仅仅是创建ApplicationContext对象

  3. 容器创建好了以后,会为容器做一些准备工作,比如为容器设置Environment、BeanFactoryPostProcessor后置处理器,并且加载主类对应的Definition

  4. 刷新容器,就是我们常说的referesh,在这里会真正的创建Bean实例

总:总结一下我刚说的,其实SpringBoot启动的时候核心就两步,创建SpringApplication对象以及run方法的调用,在run方法中会真正的实例化容器,并创建容器中需要的Bean实例,最终返回

IOC容器初始化流程

AbstractApplicationContext.refresh()
  1. 准备BeanFactory(DefaultListableBeanFactory)
    设置ClassLoader
    设置Environment
  2. 扫描要放入容器中的Bean,得到对应的BeaDefinition(只扫描,并不创建)
  3. 注册BeanPostProcessor
  4. 处理国际化
  5. 初始化事件多播器ApplicationEventMulticaster
  6. 启动tomcat
  7. 绑定事件监听器和事件多播器
  8. 实例化非懒加载的单例Bean
  9. 扫尾工作,比如清空实例化时占用的缓存等
总结

Bean生命周期


总结

Bean循环依赖

总结

SpringMVC执行流程


总结
相关推荐
AC赳赳老秦1 分钟前
DeepSeek-Coder vs Copilot:嵌入式开发场景适配性对比实战
java·前端·后端·struts·mongodb·copilot·deepseek
invicinble13 分钟前
Data Validation数据校验机制与内容
spring boot
9号达人14 分钟前
支付配置时好时坏?异步方法里的对象引用坑
java·后端·面试
爱吃山竹的大肚肚42 分钟前
优化SQL:如何使用 EXPLAIN
java·数据库·spring boot·sql·spring
韭菜炒大葱1 小时前
TailwindCSS:从“样式民工”到“UI乐高大师”的逆袭
前端·面试·编程语言
Tony Bai1 小时前
Go 性能分析的“新范式”:用关键路径分析破解高并发延迟谜题
开发语言·后端·golang
Kiyra1 小时前
Spring Boot Starter 自定义开发:封装中间件配置
spring boot·redis·后端·缓存·中间件·性能优化·rocketmq
HABuo1 小时前
【Linux进程(一)】进程深入剖析-->进程概念&PCB的底层理解
linux·运维·服务器·c语言·c++·后端·进程
码界奇点1 小时前
基于Spring Boot和微信小程序的小程序商城系统设计与实现
spring boot·微信小程序·小程序·毕业设计·源代码管理