@AutoConfiguration
是 Spring Boot 2.4 引入的一个新注解,用于标记自动配置类。它是对传统 @Configuration
注解的增强,专门用于自动配置场景。
@AutoConfiguration 注解详解
1. 基本作用
@AutoConfiguration
是一个复合注解,主要用于标识自动配置类,它提供了比 @Configuration
更明确的语义和更好的功能。
2. 注解定义
java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface AutoConfiguration {
/**
* 自动配置类的处理顺序
*/
AutoConfigurationPhase before() default AutoConfigurationPhase.NONE;
/**
* 在指定的自动配置类之后处理
*/
Class<?>[] after() default {};
/**
* 在指定的自动配置类之前处理
*/
Class<?>[] before() default {};
}
3. 与 @Configuration 的区别
java
// 传统方式
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
// 配置内容
}
// 新方式(推荐)
@AutoConfiguration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
// 配置内容
}
4. 主要特性
4.1 明确的语义(使用@Configuration的类只知道是一个配置类,并不知道是自动配置类)
java
// 明确表示这是一个自动配置类
@AutoConfiguration
@ConditionalOnClass(RedisTemplate.class)
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public RedisTemplate redisTemplate() {
return new RedisTemplate();
}
}
4.2 排序控制
java
// 控制自动配置的执行顺序
@AutoConfiguration(
before = DataSourceAutoConfiguration.class,
after = WebMvcAutoConfiguration.class
)
@ConditionalOnClass(DataSource.class)
public class CustomDataSourceAutoConfiguration {
// 配置内容
}
5. 实际应用示例
5.1 基础自动配置类
java
@AutoConfiguration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyServiceProperties properties) {
MyServiceImpl service = new MyServiceImpl();
service.setConfig(properties);
return service;
}
}
5.2 带排序的自动配置(决定当前自动配置类,在谁创建之前或者之后配置)
java
@AutoConfiguration(
before = {DataSourceAutoConfiguration.class},
after = {WebMvcAutoConfiguration.class}
)
@ConditionalOnClass(CacheManager.class)
@EnableConfigurationProperties(CacheProperties.class)
public class CacheAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public CacheManager cacheManager(CacheProperties properties) {
return new CustomCacheManager(properties);
}
}
5.3 条件化自动配置
java
@AutoConfiguration
@ConditionalOnWebApplication
@ConditionalOnClass(Servlet.class)
@ConditionalOnProperty(prefix = "my.web", name = "enabled", havingValue = "true", matchIfMissing = true)
public class WebAutoConfiguration {
@Bean
public WebInterceptor webInterceptor() {
return new WebInterceptor();
}
@Bean
public WebFilter webFilter() {
return new WebFilter();
}
}
6. 与其他注解的配合使用
6.1 与条件注解配合
java
@AutoConfiguration
@ConditionalOnClass(JdbcTemplate.class)
@ConditionalOnProperty(name = "my.jdbc.enabled", havingValue = "true", matchIfMissing = true)
public class JdbcAutoConfiguration {
@Bean
@Primary
@ConditionalOnMissingBean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
6.2 与属性配置注解配合
java
@AutoConfiguration
@EnableConfigurationProperties({
DatabaseProperties.class,
ConnectionProperties.class
})
@ConditionalOnClass(DataSource.class)
public class DatabaseAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DatabaseProperties dbProps, ConnectionProperties connProps) {
// 创建数据源
return createDataSource(dbProps, connProps);
}
}
7. 优势和特点
7.1 语义明确
- 明确标识这是一个自动配置类
- 提高代码可读性和维护性
7.2 排序支持
java
@AutoConfiguration(
before = DataSourceAutoConfiguration.class,
after = WebMvcAutoConfiguration.class
)
7.3 与Spring Boot生态系统集成
- 与
spring.factories
或AutoConfiguration.imports
文件配合使用 - 支持Spring Boot的条件化配置机制
8. 完整示例
java
// 自定义属性配置类
@ConfigurationProperties(prefix = "myapp.service")
public class MyServiceProperties {
private String url = "http://localhost:8080";
private int timeout = 5000;
private boolean enabled = true;
// getters and setters
}
// 自动配置类
@AutoConfiguration
@ConditionalOnClass(MyService.class)
@ConditionalOnProperty(prefix = "myapp.service", name = "enabled", havingValue = "true", matchIfMissing = true)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyServiceProperties properties) {
MyService service = new MyServiceImpl();
service.setUrl(properties.getUrl());
service.setTimeout(properties.getTimeout());
return service;
}
@Bean
@ConditionalOnMissingBean
public MyServiceClient myServiceClient(MyService myService) {
return new MyServiceClient(myService);
}
}
9. 最佳实践
- 使用明确的语义 :优先使用
@AutoConfiguration
而不是@Configuration
- 合理的条件注解 :结合使用
@ConditionalOnClass
、@ConditionalOnMissingBean
等 - 属性配置 :使用
@EnableConfigurationProperties
管理配置属性 - 排序控制 :必要时使用
before
和after
属性控制执行顺序 - 文档注释:为自动配置类添加清晰的文档说明
@AutoConfiguration
注解使自动配置类的意图更加明确,提供了更好的排序控制,并且是Spring Boot 2.4+推荐的标准做法。