Spring Boot 自动配置原理与实践

172 阅读2分钟

目录

  1. 什么是自动配置?
  2. 自动配置的核心机制
  3. META-INF/spring.factories 文件详解
  4. 条件注解 @ConditionalOnXxx
  5. 自定义 Starter 实践案例
  6. Spring Boot 2.4+ 新方式 AutoConfiguration.imports
  7. 总结

1. 什么是自动配置?

Spring Boot 的自动配置(Auto Configuration)是一种“开箱即用”的能力,它能根据你添加的依赖(如 Maven 或 Gradle 中引入的 jar 包),自动为你创建合适的 Bean 和配置,而无需手动编写大量配置代码。

例如:

  • 引入 spring-boot-starter-web → 自动配置 Web 环境;
  • 引入 spring-boot-starter-data-jpa → 自动配置数据库连接池、JPA 支持等。

2. 自动配置的核心机制

Spring Boot 的自动配置基于以下核心机制:

技术描述
@Configuration标记为配置类,用于注册 Bean
条件注解(如 @ConditionalOnClass控制配置是否生效
spring.factories文件声明哪些类是自动配置类
SPI(Service Provider Interface)机制Spring Boot 在启动时读取所有 jar 包中的 spring.factories

3. META-INF/spring.factories 文件详解

✅ 文件位置

src/main/resources/META-INF/spring.factories

✅ 示例内容

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyAutoConfiguration

✅ 含义说明

当你将某个类写入 EnableAutoConfiguration 列表中后,Spring Boot 在启动时会尝试加载这个类,并根据其上的注解决定是否注入 Bean。


4. 条件注解 @ConditionalOnXxx

这些注解决定了自动配置类或 Bean 是否被加载。

常见注解列表:

注解作用
@ConditionalOnClass指定类存在时才启用
@ConditionalOnMissingClass指定类不存在时才启用
@ConditionalOnBean容器中存在指定 Bean 时启用
@ConditionalOnMissingBean容器中没有指定 Bean 时启用
@ConditionalOnProperty配置文件中某属性存在且为 true 时启用
@ConditionalOnExpressionSpEL 表达式为 true 时启用

示例:

@Configuration
@ConditionalOnClass(name = "com.example.SomeExternalClass")
public class MyAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

5. 自定义 Starter 实践案例

🧱 步骤一:创建项目结构

深色版本

my-spring-boot-starter/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/example/starter/
│       │       ├── MyAutoConfiguration.java
│       │       └── MyService.java
│       └── resources/
│           └── META-INF/
│               └── spring.factories
└── pom.xml

📄 文件内容示例:

MyService.java

Java


深色版本

package com.example.starter;

public class MyService {
    public void sayHello() {
        System.out.println("Hello from MyService!");
    }
}

MyAutoConfiguration.java

Java


深色版本

package com.example.starter;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;

@Configuration
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.starter.MyAutoConfiguration

📦 使用 starter

在另一个 Spring Boot 项目中引入你的 starter:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

然后就可以直接使用 MyService

@Autowired
private MyService myService;

@GetMapping("/hello")
public String hello() {
    myService.sayHello();
    return "OK";
}

6. Spring Boot 2.4+ 新方式:AutoConfiguration.imports

从 Spring Boot 2.4 开始,官方推荐使用新的方式来替代 spring.factories

✅ 文件路径:

src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

✅ 内容格式(每行一个类名):

com.example.starter.MyAutoConfiguration

这种方式更清晰、模块化更强,也更适合未来版本升级。


7. 总结

要点内容
spring.factories是什么?Spring Boot 的 SPI 机制,用于声明自动配置类
自动配置类会被 Spring 加载吗?是的,不仅加载,还会作为配置类处理并可能注入 Bean
条件注解的作用?控制配置是否生效,实现按需加载
如何开发自己的 Starter?创建配置类 + 添加 spring.factories 或 AutoConfiguration.imports
推荐方式?Spring Boot 2.4+ 推荐使用 AutoConfiguration.imports 替代 spring.factories

📚 参考资料

  • Spring Boot 官方文档 - Auto-configuration
  • Spring Boot 2.4 Release Notes
  • Creating Your Own Auto-Configuration