- Published on
java 练习
- Authors

- Name
- MissTree
面试题
springboot 启动流程
1. @SpringBootApplication 通过启动类启动服务
1.1 @Configuration:标记配置类
1.2 @EnableAutoConfiguration:启用自动配置
1.3 @ComponentScan:扫描当前包及子包下的组件(如 @Component, @Service 等)。
1.4 加载 ApplicationListener:监听 Spring Boot 事件和操作
1.5 加载 ApplictionContextInitializer:初始化上下文
2. SpringApplication.run() 执行流程
2.1 创建实例
2.2 执行 run() 方法 加载 Spring 运行环境(Environment)
2.3 刷新容器
3. 环境准备
3.1 环境准备:加载 application.properties/application.yml 配置、解析环境变量、命令行参数等
3.2 创建 ApplicationContext (createApplicationContext): 根据应用类型选择上下文实现
3.3 刷新上下文 (refreshContext):加载 Bean 定义、实例化单例 Bean、初始化 AOP、启动嵌入式容器
3.4 自动配置 (@EnableAutoConfiguration):条件化配置(@ConditionalOnClass, @ConditionalOnMissingBean 等)决定是否生效
3.5 触发事件:生命周期事件:
ApplicationStartingEvent → ApplicationEnvironmentPreparedEvent → ApplicationContextInitializedEvent → ApplicationPreparedEvent → ContextRefreshedEvent → ApplicationStartedEvent → ApplicationReadyEvent → ApplicationFailedEvent(失败时)
4.扩展点
4.1 ApplicationContextInitializer:在上下文刷新前修改配置
4.2 ApplicationListener:监听应用事件(如环境准备完成、上下文刷新等)
4.3 SpringApplicationRunListener:监听整个启动过程
4.4 BeanPostProcessor:在 Bean 初始化前后进行增强
ApplicationContextlnitializer
I0C容器对象创建完成后执行,可以对上下文环境做一些操作,例如运行环境属性注册等 自定义类,实现ApplicationcontextInitializer接口,在resource/META-INF/spring.factories配置文件中配置自定义的类
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("【ApplicationContextInitializer】初始化上下文:" + applicationContext.getId());
// 1. 获取环境变量并修改
ConfigurableEnvironment environment = applicationContext.getEnvironment();
System.out.println("当前环境变量:" + environment.getPropertySources());
// 2. 动态注册一个 Bean(需结合 BeanDefinitionRegistryPostProcessor)
// 注意:直接在这里注册 Bean 不会生效,因为此时 BeanFactory 尚未准备好
// 通常需要结合 BeanDefinitionRegistryPostProcessor 使用
// 3. 其他自定义逻辑(如修改配置文件、注册监听器等)
}
}
# resource/META-INF/spring.factories
org.springframework.context.ApplicationContextInitializer=/com.example.MyApplicationContextInitializer
ApplicationListener
监听应用事件,如环境准备完成、上下文刷新等 自定义类,实现ApplicationListener接口,在resource/META-INF/spring.factories配置文件中配置自定义的类
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("【ApplicationListener】上下文刷新完成:" + event.getApplicationContext().getId());
// 可以在这里处理上下文刷新完成后的逻辑
//成功
if(event instanceof ApplicationReadyEvent) {
System.out.println("【ApplicationListener】上下文刷新成功");
}
if(event instanceof ApplicationFailedEvent) {
System.out.println("【ApplicationListener】上下文刷新失败");
}
}
}
# resource/META-INF/spring.factories
org.springframework.context.ApplicationListener=/com.example.MyApplicationListener
SpringApplicationRunListener
springboot IOC 容器初始化流程
Bean生命周期
Bean循环依赖
BeanFactory
Bean容器的根接口,提供Bean对象的创建、配置、依赖注入等功能