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

相关推荐
程序员cxuan12 小时前
这个插件,直接让 Java 小白秒变资深开发
人工智能·后端·程序员
ZengLiangYi12 小时前
Prompt 工程:让 LLM 输出结构化 JSON
前端·javascript·后端
Skr-Eric12 小时前
面试跨境服务相关知识
面试·职场和发展
猩球中的木子12 小时前
什么是DNS解析
前端·vue.js·面试
Oo_行者_oO12 小时前
MyBatis-Plus 字段数学计算封装
后端
bandaoyu12 小时前
【AMD】HDP(Host Data Path)是什么
java·后端·spring
用户21816970493012 小时前
golang socket(一) TCP协议 简单的socket服务器和客户端
后端
ZengLiangYi13 小时前
MCP 协议从零实现:手写最简 MCP Server
前端·javascript·后端