Spring Boot 自动配置顺序与优先级
多个自动配置类可能存在依赖关系,Spring Boot提供注解控制配置加载顺序。
默认顺序
默认按spring.factories中的声明顺序加载,但顺序不可靠,应使用注解显式控制。
@AutoConfigureBefore
Java
// 在指定配置类之前加载
@Configuration
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class MyDataSourceInitConfiguration {
// 在DataSourceAutoConfiguration之前执行初始化
}
// 多个配置类
@AutoConfigureBefore({
DataSourceAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class
})
@AutoConfigureAfter
Java
// 在指定配置类之后加载
@Configuration
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
public class MyMvcConfiguration {
// WebMvc配置完成后执行
}
// 常见用法:在数据源配置后初始化
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MyDatabaseInitConfiguration { }
@AutoConfigureOrder
Java
// 数值越小优先级越高,默认0
@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // Integer.MIN_VALUE
public class EarlyConfiguration { }
@Configuration
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE) // Integer.MAX_VALUE
public class LateConfiguration { }
// 自定义值
@AutoConfigureOrder(100)
public class MyConfiguration { }
顺序控制场景
场景一:初始化顺序
Java
@Configuration
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class DataSourcePropertiesInitConfiguration {
@Bean
public DataSourceInitializer dataSourceInitializer() {
// 在DataSource创建前执行初始化脚本
}
}
场景二:覆盖默认配置
Java
@Configuration
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
@ConditionalOnMissingBean(ViewResolver.class)
public class MyMvcConfiguration {
@Bean
public ViewResolver viewResolver() {
// 在WebMvcAutoConfiguration之后检查,可覆盖默认配置
}
}
场景三:条件依赖
Java
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@ConditionalOnBean(RedisConnectionFactory.class)
public class MyCacheConfiguration {
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
// 确保RedisConnectionFactory已存在
}
}
内置配置顺序示例
Java
// HibernateJpaAutoConfiguration
@Configuration
@AutoConfigureAfter(HibernateJpaConfiguration.class)
public class HibernateJpaAutoConfiguration { }
// DataSourceAutoConfiguration
@Configuration
@AutoConfigureBefore(SqlInitializationAutoConfiguration.class)
public class DataSourceAutoConfiguration { }
DeferredImportSelector与顺序
Java
// AutoConfigurationImportSelector实现DeferredImportSelector
// 所有自动配置类在普通@Configuration类之后处理
// 顺序:
// 1. 普通配置类(@Configuration)
// 2. 自动配置类(按@AutoConfigureOrder/Before/After排序)
顺序优先级规则
| 优先级 | 机制 |
|---|---|
| 1 | @AutoConfigureOrder数值(越小越优先) |
| 2 | @AutoConfigureBefore |
| 3 | @AutoConfigureAfter |
| 4 | spring.factories声明顺序 |
显式使用注解控制顺序,不依赖spring.factories声明顺序。
要点总结
- @AutoConfigureBefore在指定配置前执行
- @AutoConfigureAfter在指定配置后执行
- @AutoConfigureOrder控制整体优先级
- 自动配置类在普通配置类之后加载
- 组合使用实现复杂依赖关系控制
📝 发现内容有误?点击此处直接编辑