Published on

java 练习

Authors
  • avatar
    Name
    MissTree
    Twitter

面试题

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对象的创建、配置、依赖注入等功能

Spring MVC 执行流程

BeanFactory 和 ApplicationContext 区别

Spring AOP

Spring 事务传播行为

Spring 事务隔离级别

Spring 事务失效场景

Spring 事务实现原理

Spring MVC 工作流程

Spring MVC 请求处理流程

Spring MVC 注解

Spring MVC 异常处理