Skip to content

SpringBoot 自动配置原理

TIP

SpringBoot 的自动配置(@EnableAutoConfiguration)根据 classpath 依赖和配置属性自动配置 Bean,大幅减少了手动配置的工作量。

自动配置的核心

java
// @SpringBootApplication → @EnableAutoConfiguration
// → 导入 AutoConfigurationImportSelector

public class AutoConfigurationImportSelector {
    // 扫描所有 spring.factories 中的自动配置类
}

spring.factories 文件

# META-INF/spring.factories 中声明了所有自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,...

条件注解

SpringBoot 使用条件注解判断是否应用某个自动配置:

java
@Configuration
@ConditionalOnClass(RedisOperations.class)  // classpath 中有 Redis
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(StringRedisTemplate.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        return new StringRedisTemplate(factory);
    }
}

常用条件注解

java
@ConditionalOnClass           // classpath 中存在指定类
@ConditionalOnMissingClass    // classpath 中不存在指定类
@ConditionalOnBean            // 容器中存在指定 Bean
@ConditionalOnMissingBean     // 容器中不存在指定 Bean
@ConditionalOnProperty        // 配置文件中存在指定属性
@ConditionalOnExpression      // SpEL 表达式为 true
@ConditionalOnResource        // 存在指定资源文件
@ConditionalOnWebApplication  // 当前是 Web 环境

自定义自动配置

java
// 1. 创建自动配置类
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService(MyProperties properties) {
        return new MyService(properties.getPrefix());
    }
}

// 2. 配置属性
@ConfigurationProperties(prefix = "my.service")
public class MyProperties {
    private String prefix = "default";
    // getter / setter
}

// 3. 注册到 spring.factories
// META-INF/spring.factories:
// org.springframework.boot.autoconfigure.EnableAutoConfiguration=// com.example.config.MyAutoConfiguration

TIP

查看哪些自动配置生效/未生效:在 application.yml 中设置 debug: true,启动时会输出自动配置报告。