SpringBoot 核心面试知识点(自动配置/启动流程/注解/Starter)

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 执行流程(面试满分回答)

  1. 启动类标注 @SpringBootApplication
    组合注解包含 @EnableAutoConfiguration。
  2. 导入 AutoConfigurationImportSelector
    实现 ImportSelector 接口,返回需要自动配置的类全限定名。
  3. 读取 SPI 配置文件
    读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。
  4. 条件过滤
    根据 @Conditional 系列注解判断是否满足装配条件。
  5. 自动配置生效
    满足条件的配置类被加载,对应 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 自定义步骤(面试+实战)

  1. 创建 Maven 项目
    命名规范:xxx-spring-boot-starter。
  2. 定义核心功能类
    业务工具类、服务类。
  3. 编写自动配置类
    用 @Configuration + @Bean 定义 Bean。
  4. 编写条件注解
    控制 Bean 何时生效。
  5. 配置 SPI 文件
    在 META-INF/spring/...imports 中注册配置类。
  6. 打包安装到本地仓库
    其他项目直接引入依赖即可使用。

简化示例

java 复制代码
@Configuration
@ConditionalOnClass(DemoService.class)
@EnableConfigurationProperties(DemoProperties.class)
public class DemoAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public DemoService demoService(DemoProperties properties) {
        return new DemoService(properties);
    }
}

三、配置加载优先级(高频必背)

优先级从高到低(高优先级覆盖低优先级):

  1. 命令行参数 --key=value
  2. Java 系统属性 System.getProperties()
  3. 操作系统环境变量
  4. application-{profile}.yml(激活的环境)
  5. application.yml
  6. 配置类 @PropertySource
  7. 默认属性(SpringBoot 内部)

核心结论

  • 命令行 > 环境变量 > 配置文件
  • profile 配置 > 默认配置

四、SpringBoot 启动流程(完整 12 步)

4.1 入口

java 复制代码
SpringApplication.run(Application.class, args);

4.2 详细流程

  1. 创建 SpringApplication 实例
    推断 Web 类型、设置初始化器、监听器。
  2. 启动计时、开启监听
    发布应用启动事件。
  3. 准备环境 Environment
    加载配置、命令行参数、系统属性。
  4. 创建并启动 Banner 打印
  5. 创建 IoC 容器(ApplicationContext)
    Web 应用创建 AnnotationConfigServletWebServerApplicationContext。
  6. 准备上下文
    配置环境、设置 Bean 生成器。
  7. 执行 ApplicationContextInitializer
    扩展接口,容器刷新前回调。
  8. refresh 刷新容器(核心)
    扫描 Bean、加载自动配置、完成依赖注入。
  9. 执行 Runner
    ApplicationRunner、CommandLineRunner。
  10. 启动完成
    发布启动成功事件。
  11. 启动 Web 服务器
    Tomcat/Jetty/Undertow 启动。
  12. 对外提供服务

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);
}

六、总结(面试速背版)

  1. @EnableAutoConfiguration
    Import 导入选择器 → 读取 SPI → 条件过滤 → 自动装配。
  2. SPI
    服务发现机制,配置文件定义实现类,SpringBoot 自动加载。
  3. Starter 自定义
    功能类 → 配置类 → SPI 注册 → 打包依赖。
  4. 配置优先级
    命令行 > 环境变量 > profile > application.yml。
  5. 启动流程
    环境 → 容器 → 初始化 → refresh → Runner → 启动服务。
  6. @Configuration
    配置类,CGLIB 代理,保证 @Bean 单例。
  7. @Bean
    方法级注入,参数自动依赖注入,支持生命周期方法。

相关推荐
考虑考虑7 小时前
JDK26中的Map.ofLazy
java·后端·java ee
云浪8 小时前
Go 并发实战:从零实现一个高并发安全的任务调度器
javascript·后端·go
苏三的开发日记8 小时前
Docker 启动顺序优化(CentOS / Ubuntu)
后端
高频因子挖掘机10 小时前
同一交易日出现重复 K 线:去重前先确认时间、来源和粒度
后端·github·api
feely020811 小时前
《我写了 31 个静态扫描插件,踩了 7 个「假绿」》
后端
进击的明明12 小时前
当AI开始“边想边干”:深入聊聊ReAct,以及如何用Python手搓一个简单Agent
python·面试·agent
橙子家12 小时前
参数校验类异常(Argument Exception)【C# Exception 详解系列一】
后端
掘金挖土12 小时前
前端手摸手跑路之 AI 应用开发(九)
前端·后端
全栈弄潮儿12 小时前
Python实战第8期:函数
后端·python·编程语言