Java高频面试题:Springboot的自动配置原理?

大家好,我是锋哥。今天分享关于【Java高频面试题:Springboot的自动配置原理?】面试题 。希望对大家有帮助;

Java高频面试题:Springboot的自动配置原理?

Spring Boot 的**自动配置(Auto-Configuration)**是其"开箱即用"的核心机制之一,它的目标是:根据项目中引入的依赖和当前环境,自动为你配置 Spring Bean,而无需手动 XML 或大量 Java 配置。

下面从原理层面帮你系统讲清楚。


一、自动配置是怎么启动的?

Spring Boot 的入口在启动类:

复制代码
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

其中最关键的是这个注解:

复制代码
@SpringBootApplication

它本质上是三个注解的组合:

  • @SpringBootConfiguration
  • @ComponentScan
  • @EnableAutoConfiguration ⭐(核心)

二、自动配置的核心开关:@EnableAutoConfiguration

复制代码
@EnableAutoConfiguration

它做了什么?

👉 开启自动配置机制,并导入一批"自动配置类"

底层通过:

复制代码
@Import(AutoConfigurationImportSelector.class)

实现。


三、核心机制:AutoConfigurationImportSelector

这是自动配置的"调度中心"。

它主要做三件事:

1. 加载自动配置类名单

Spring Boot 会从配置文件中加载:

复制代码
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

(Spring Boot 3+)

或者旧版本:

复制代码
META-INF/spring.factories

里面定义了大量自动配置类,例如:

复制代码
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

2. 过滤哪些配置生效

不是所有自动配置都会加载,而是会经过条件判断(重点!)


四、自动配置的核心机制:条件注解(Condition)

自动配置类上通常会带有大量条件注解,例如:

常见条件注解:

  • @ConditionalOnClass:类路径中存在某个类才生效
  • @ConditionalOnMissingBean:容器中没有某个 Bean 才创建
  • @ConditionalOnProperty:配置文件中存在某个配置才生效
  • @ConditionalOnBean:容器中已有某个 Bean 才生效

举个例子(非常关键)

复制代码
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

含义:

  • 只有当 classpath 中存在 DataSource 类
  • 且容器中没有 DataSource Bean 👉 才会自动创建一个 DataSource

五、自动配置的执行流程总结

整体流程可以理解为:

复制代码
SpringApplication.run()
        ↓
@EnableAutoConfiguration
        ↓
AutoConfigurationImportSelector
        ↓
读取 AutoConfiguration.imports
        ↓
加载一堆自动配置类
        ↓
每个配置类进行 @Conditional 判断
        ↓
满足条件 → 注册 Bean 到 Spring 容器
        ↓
完成自动装配

六、为什么"引入依赖就能自动配置"?

关键在于:

👉 classpath + 条件注解

例如你引入:

复制代码
spring-boot-starter-web

会自动带来:

  • Tomcat
  • Spring MVC
  • Jackson

于是:

  • classpath 中存在相关类 ✔
  • 条件成立 ✔
  • 自动配置生效 ✔

👉 最终自动帮你配置:

  • DispatcherServlet
  • Jackson HttpMessageConverter
  • 内嵌 Tomcat
  • Spring MVC 组件

七、自动配置 vs 手动配置

方式 特点
手动配置 需要自己定义 Bean
自动配置 Spring Boot 根据条件自动创建

但本质是:

👉 自动配置 = 帮你写了一堆"默认配置类"


八、如何排查自动配置?

可以通过以下方式查看哪些自动配置生效:

1. 开启 debug 日志

复制代码
debug=true

控制台会输出:

复制代码
Positive matches
Negative matches

告诉你:

  • 哪些自动配置生效
  • 哪些没有生效
  • 为什么没生效

2. Actuator(如果引入)

访问:

复制代码
/actuator/conditions

可以查看条件匹配情况


九、如何自定义或覆盖自动配置?

Spring Boot 的原则是:

👉 用户配置优先于自动配置

如果你自己定义了 Bean:

复制代码
@Bean
public DataSource dataSource() {
    return new DruidDataSource();
}

那么:

👉 自动配置中的 @ConditionalOnMissingBean 会失效

👉 Spring Boot 就不会再创建默认 DataSource


十、一句话总结

Spring Boot 自动配置的本质是:

通过 @EnableAutoConfiguration + 条件注解 + 配置类加载机制,根据 classpath 和环境自动为容器注册 Bean,从而实现"约定优于配置"。

相关推荐
阿俊-全栈开发6 小时前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户
怕浪猫7 小时前
2026 年 AI Agent 面试到底考什么?这套题库覆盖了 90% 的高频考点
面试·aigc·ai编程
wuminyu9 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
泡沫_花火10 小时前
大模型开发相关岗位面试资料(含算法)
语言模型·自然语言处理·面试·职场和发展
Zhou14113610 小时前
SpringBoot_03_Web开发
前端·spring boot·python
蜗牛互联网11 小时前
WSL Containers GA:本地AI容器的生命周期、网络与治理验收
java·网络·人工智能·后端
龙亘川11 小时前
铭记英烈守初心,数字强基促服务:亘川智城退役军人服务系统的实践与价值
java·数据库·人工智能
OxYGC12 小时前
[AI工程] Spring AI 第廿一篇:存量 REST 接口的 MCP 化改造实录——工具从哪条路径注册、参数描述怎么写、身份怎么过去
java·人工智能·spring
Zhou14113612 小时前
SpringBoot_02_自动配置原理
java·spring boot·后端