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.MyAutoConfigurationTIP
查看哪些自动配置生效/未生效:在 application.yml 中设置 debug: true,启动时会输出自动配置报告。