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

相关推荐
沉默王二5 分钟前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
onething36523 分钟前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈
一个做软件开发的牛马37 分钟前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
码事漫谈41 分钟前
AI 编程的「三体」架构:OpenSpec + Superpowers + GStack 如何让一个开发者撑起整个研发团队
后端
吃饱了得干活44 分钟前
深入解析 OpenFeign:从重试、拦截到负载均衡的全维度实践
后端
onething3651 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 6 —— 业务完善 + 会话消息预览
人工智能·后端·全栈
BingoGo1 小时前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack1 小时前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
IT_陈寒1 小时前
SpringBoot自动配置的坑,我爬了三天才出来
前端·人工智能·后端