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执行流程


总结
相关推荐
(Charon)2 分钟前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
EatFan12 分钟前
从云原生到AI原生:2026后端架构“三驾马车”(事件驱动、虚拟线程、AI Agent内嵌)演进解析
spring boot·云原生·架构·虚拟线程·ai-native·ai agent·spring ai
专业程序开发源1 小时前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
AINative软件工程1 小时前
LLM Prompt Registry 工程实践:集中管理 Prompt,让模型调用不再散落在代码各处
后端·python·llm
IT_陈寒1 小时前
SpringBoot自动配置的坑我帮你踩过了
前端·人工智能·后端
vx_Biye_Design1 小时前
springboot角色扮演服务平台65161-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·spring·课程设计
vx_Biye_Design2 小时前
springboot咖啡厅顾客点单管理系统12080-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
QQ_21696290962 小时前
基于微信小程序的智能膳食分析系统
java·大数据·spring boot·微信小程序·小程序·旅游
专业程序开发源2 小时前
flask动漫推荐系统32319-计算机课程设计、毕业设计
java·spring boot·后端·django·flask·php·课程设计
FYKJ_20102 小时前
springboot手工蜀绣在线销售系统60947-计算机课程设计、毕业设计
java·spring boot·后端·python·mysql·spark·课程设计