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
    方法级注入,参数自动依赖注入,支持生命周期方法。

相关推荐
JavaGuide43 分钟前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel1 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
此时不提桶,更待何时2 小时前
05-03-B-ClickHouse与OLAP面试与生产事故实战
clickhouse·面试·nosql
IT_陈寒3 小时前
Java线程池这破玩意,差点让我周末加班排查到凌晨
前端·人工智能·后端
此时不提桶,更待何时3 小时前
03-04-B-连接池与DB治理面试与生产事故实战
mysql·面试
弈栈录4 小时前
Java AI 应用的异步化与高并发设计
java·后端·架构
凤山老林4 小时前
Spring Boot 集成 iText 7 实现动态 PDF 生成与电子签章:合同、报表场景实战
spring boot·后端·pdf·itext7·电子签章
kaiyou20264 小时前
数据分析岗面试,如何把考证学到的知识讲成业务案例?
面试·数据挖掘·数据分析
孙启超4 小时前
【AI开发之Rust】第 19 课:UniFFI 导出核心能力
开发语言·后端·rust
卓怡学长5 小时前
w204基于springbo旅行社签证代理服务系统
java·spring boot·spring·intellij-idea