SpringBoot 核心面试知识点(自动配置/启动流程/注解/Starter)
文章标签:#springboot #面试 #java #自动配置 #starter
前言
本文为自用复习笔记,核心用于梳理SpringBoot 核心原理 ,方便后续回顾、巩固重点,避免遗忘关键细节。
本次笔记将围绕 @EnableAutoConfiguration 原理、SPI 机制、starter 自定义、配置加载优先级、SpringBoot 启动流程、常用注解详解 展开详细剖析。
PS:
最近跳槽复习 Java 全栈,SpringBoot 原理是面试必问,必须把自动配置、SPI、启动流程、注解底层全部吃透,这份笔记适合突击背诵。
本文根据自己整理与 AI 生成部分内容相结合。
一、@EnableAutoConfiguration 原理(核心必背)
1.1 整体作用
开启 SpringBoot 自动配置,让框架根据依赖自动装配 Bean,无需手动 XML 配置。
1.2 底层注解结构
java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
核心:@Import(AutoConfigurationImportSelector.class)
1.3 执行流程(面试满分回答)
- 启动类标注 @SpringBootApplication
组合注解包含@EnableAutoConfiguration。 - 导入 AutoConfigurationImportSelector
实现ImportSelector接口,返回需要自动配置的类全限定名。 - 读取 SPI 配置文件
读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。 - 条件过滤
根据@Conditional系列注解判断是否满足装配条件。 - 自动配置生效
满足条件的配置类被加载,对应 Bean 注入 IoC 容器。
1.4 核心条件注解(@Conditional)
@ConditionalOnClass:类路径存在指定类@ConditionalOnBean:容器存在指定 Bean@ConditionalOnMissingBean:容器不存在指定 Bean@ConditionalOnProperty:配置文件存在指定属性
二、SPI 机制 & Starter 自定义
2.1 SPI 机制(Service Provider Interface)
2.1.1 定义
SPI 是服务发现机制,框架定义接口,第三方实现,框架通过配置文件自动加载实现类。
2.1.2 SpringBoot 中 SPI 位置
- SpringBoot 2.7+:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - 旧版本:
META-INF/spring.factories
2.1.3 作用
解耦、自动装配、模块化、支持第三方扩展。
2.2 Starter 自定义步骤(面试+实战)
- 创建 Maven 项目
命名规范:xxx-spring-boot-starter。 - 定义核心功能类
业务工具类、服务类。 - 编写自动配置类
用@Configuration+@Bean定义 Bean。 - 编写条件注解
控制 Bean 何时生效。 - 配置 SPI 文件
在META-INF/spring/...imports中注册配置类。 - 打包安装到本地仓库
其他项目直接引入依赖即可使用。
简化示例
java
@Configuration
@ConditionalOnClass(DemoService.class)
@EnableConfigurationProperties(DemoProperties.class)
public class DemoAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DemoService demoService(DemoProperties properties) {
return new DemoService(properties);
}
}
三、配置加载优先级(高频必背)
优先级从高到低(高优先级覆盖低优先级):
- 命令行参数
--key=value - Java 系统属性
System.getProperties() - 操作系统环境变量
application-{profile}.yml(激活的环境)application.yml- 配置类
@PropertySource - 默认属性(SpringBoot 内部)
核心结论
- 命令行 > 环境变量 > 配置文件
- profile 配置 > 默认配置
四、SpringBoot 启动流程(完整 12 步)
4.1 入口
java
SpringApplication.run(Application.class, args);
4.2 详细流程
- 创建 SpringApplication 实例
推断 Web 类型、设置初始化器、监听器。 - 启动计时、开启监听
发布应用启动事件。 - 准备环境 Environment
加载配置、命令行参数、系统属性。 - 创建并启动 Banner 打印
- 创建 IoC 容器(ApplicationContext)
Web 应用创建AnnotationConfigServletWebServerApplicationContext。 - 准备上下文
配置环境、设置 Bean 生成器。 - 执行 ApplicationContextInitializer
扩展接口,容器刷新前回调。 - refresh 刷新容器(核心)
扫描 Bean、加载自动配置、完成依赖注入。 - 执行 Runner
ApplicationRunner、CommandLineRunner。 - 启动完成
发布启动成功事件。 - 启动 Web 服务器
Tomcat/Jetty/Undertow 启动。 - 对外提供服务
4.3 一句话速记
准备环境 → 创建容器 → 初始化 → 刷新 → 执行 Runner → 启动服务
五、常用注解详解(@Configuration / @Bean)
5.1 @Configuration
5.1.1 作用
标记当前类为配置类,替代 XML 文件,用于定义 Bean。
5.1.2 底层原理
被 CGLIB 代理,保证 @Bean 方法调用是单例。
5.1.3 核心属性
proxyBeanMethods:true(默认):CGLIB 代理,@Bean单例。false:轻量级模式,不代理,每次调用都新建。
示例
java
@Configuration(proxyBeanMethods = false)
public class AppConfig {
}
5.2 @Bean
5.2.1 作用
标注在方法上,将方法返回对象注入 IoC 容器。
5.2.2 常用属性
name/value:指定 Bean 名称initMethod:初始化方法destroyMethod:销毁方法autowireCandidate:是否作为自动装配候选
示例
java
@Bean(name = "userService", initMethod = "init", destroyMethod = "destroy")
public UserService userService() {
return new UserService();
}
5.2.3 依赖注入
方法参数会自动从容器获取:
java
@Bean
public UserService userService(UserDao userDao) {
return new UserService(userDao);
}
六、总结(面试速背版)
- @EnableAutoConfiguration
Import 导入选择器 → 读取 SPI → 条件过滤 → 自动装配。 - SPI
服务发现机制,配置文件定义实现类,SpringBoot 自动加载。 - Starter 自定义
功能类 → 配置类 → SPI 注册 → 打包依赖。 - 配置优先级
命令行 > 环境变量 > profile > application.yml。 - 启动流程
环境 → 容器 → 初始化 → refresh → Runner → 启动服务。 - @Configuration
配置类,CGLIB 代理,保证@Bean单例。 - @Bean
方法级注入,参数自动依赖注入,支持生命周期方法。