“Java+AI全栈工程师”问答02:Spring Boot 自动配置原理

"Java+AI全栈工程师"问答02:Spring Boot 自动配置原理

在"Java+AI全栈工程师"课程里面,有学员提到了这样一个问题:登SpringBoot自动配置原理是什么?

这里就这位同学的问题,统一针对大家做下回复,便于其他同学参考学习。往期提问答,可以在我主页查到。

Spring Boot 自动配置的核心作用:帮你自动配置好常用组件(如Redis、MyBatis、MVC、数据源等),无需手动编写XML/配置类,开箱即用。

本节从核心注解 → 加载流程 → 工作原理 → 生效条件 → 自定义 一步步讲透。


一、核心入口:@SpringBootApplication

自动配置的总开关就是这个启动类上的注解:

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

它本质是3个注解的组合:

java 复制代码
@SpringBootConfiguration  // 标记为配置类
@ComponentScan            // 扫描包
@EnableAutoConfiguration  // **开启自动配置(核心!)**

真正触发自动配置的只有一个:@EnableAutoConfiguration


二、自动配置核心流程(一句话总结)

Spring Boot 启动时:

  1. 读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件
  2. 加载所有自动配置类(如DataSourceAutoConfiguration、RedisAutoConfiguration)
  3. 根据条件注解判断是否需要创建Bean
  4. 自动将组件注入容器 → 你直接用就行

三、详细工作原理

1. @EnableAutoConfiguration 做了什么?

java 复制代码
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

它通过 @Import 导入了 AutoConfigurationImportSelector ,这个类会批量加载所有自动配置类。

2. 去哪里加载自动配置类?

Spring Boot 约定了一个固定文件路径:

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

打开 spring-boot-autoconfigure 依赖,你能看到里面写死了几百个自动配置类:

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

3. 自动配置类长什么样?(举例 RedisAutoConfiguration)

java 复制代码
@AutoConfiguration
@ConditionalOnClass(RedisOperations.class)  // 类路径存在Redis才生效
@EnableConfigurationProperties(RedisProperties.class) // 绑定配置文件
public class RedisAutoConfiguration {

    @Bean  // 自动创建 RedisTemplate
    @ConditionalOnMissingBean  // 你没自己定义,我才创建
    public RedisTemplate<String, Object> redisTemplate(
            RedisConnectionFactory redisConnectionFactory) {
        // ... 配置好RedisTemplate
    }
}

4. 关键:条件注解(什么时候生效?)

自动配置不是无脑配置,满足条件才会创建Bean:

注解 作用
@ConditionalOnClass 类路径下存在某个类
@ConditionalOnMissingBean 容器中没有这个Bean
@ConditionalOnProperty 配置文件开启某项配置
@ConditionalOnBean 容器中存在某个Bean
@ConditionalOnWebApplication 当前是Web环境

规则:你配了我就不覆盖,你没配我自动配。


四、自动配置完整流程(最清晰版)

  1. 启动类 @SpringBootApplication → 触发 @EnableAutoConfiguration
  2. 加载 AutoConfigurationImportSelector
  3. 读取 META-INF/spring/...imports 文件
  4. 加载所有自动配置类(xxxAutoConfiguration)
  5. 执行条件判断
  6. 符合条件 → 创建Bean → 放入Spring容器
  7. 你直接使用,无需手动配置

五、自动配置从哪里读取配置?

自动配置类会绑定 xxxProperties 类:

java 复制代码
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
    private String host = "localhost";
    private int port = 6379;
    // ...
}

你在 application.yml 写的配置会自动覆盖默认值:

yaml 复制代码
spring:
  redis:
    host: 127.0.0.1
    port: 6379

六、如何自定义/关闭自动配置?

1. 覆盖自动配置(自己定义Bean)

java 复制代码
@Bean
public RedisTemplate<String, Object> redisTemplate() {
    // 自己定义,Spring Boot 就不会自动配置
}

因为有 @ConditionalOnMissingBean。

2. 排除不需要的自动配置

java 复制代码
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

总结(面试必背)

  1. 自动配置的开关 :@EnableAutoConfiguration
  2. 加载规则 :读取 META-INF/spring/...imports 里的配置类
  3. 生效规则 :@Conditional 系列条件注解
  4. 配置来源 :xxxProperties + 配置文件
  5. 核心思想 :约定大于配置,开箱即用

如何系统学习Java+AI技能?

"Java+AI全栈工程师"课程24周系统化教学+12个月全程伴学,从零基础入门到高阶实战,手把手带你打通后端+前端+AI原生开发全场景,以企业级「仿某书」项目贯穿全程,完成从单体架构到分布式、前后端分离、微服务、AI融合、容器化部署的全链路实战,手敲代码锤炼真功夫,让你毕业即能独当一面,轻松拿下高薪offer!

相关推荐
旖旎夜光8 分钟前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
Lansonli17 分钟前
大数据Spark(八十八):Spark任务资源之Standalone集群测试
java·服务器·spark
ShineWinsu31 分钟前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
syyjhchou33 分钟前
自己搭企业内部中转站,怎么让请求更容易命中缓存
人工智能·后端·语言模型·aigc
budingxiaomoli35 分钟前
Spring AOP
java·spring·java-ee
特立独行的猫A40 分钟前
Ionic + 仓颉语言的 cj-tauri 开发框架实战:开发精美移动端 APP
java·后端·python
nice_lcj5201 小时前
LRU 缓存入门:它是什么、怎么用、面试怎么手写
java·数据结构·缓存·面试·lru
普通人61 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
꧁细听勿语情꧂1 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
SomeOtherTime1 小时前
Rust集合(AI回答)
开发语言·后端·rust