@AutoConfiguration和@Configuration区别

@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.factoriesAutoConfiguration.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. 最佳实践

  1. 使用明确的语义 :优先使用 @AutoConfiguration 而不是 @Configuration
  2. 合理的条件注解 :结合使用 @ConditionalOnClass@ConditionalOnMissingBean
  3. 属性配置 :使用 @EnableConfigurationProperties 管理配置属性
  4. 排序控制 :必要时使用 beforeafter 属性控制执行顺序
  5. 文档注释:为自动配置类添加清晰的文档说明

@AutoConfiguration 注解使自动配置类的意图更加明确,提供了更好的排序控制,并且是Spring Boot 2.4+推荐的标准做法。

相关推荐
IT_陈寒41 分钟前
Python性能优化:用这5个鲜为人知的内置函数让你的代码提速50%
前端·人工智能·后端
她说彩礼65万1 小时前
ASP.NET Core 应用程序启动机制 宿主概念
后端·asp.net
爱读源码的大都督1 小时前
天下苦@NonNull久矣,JSpecify总算来了,Spring 7率先支持!
java·后端·架构
道可到1 小时前
别再瞎拼技术栈!Postgres 已经能干 Redis 的活了
redis·后端·postgresql
野犬寒鸦1 小时前
从零起步学习Redis || 第十二章:Redis Cluster集群如何解决Redis单机模式的性能瓶颈及高可用分布式部署方案详解
java·数据库·redis·后端·缓存
间彧1 小时前
防盗链技术详解与SpringBoot实现方案
后端
ShooterJ2 小时前
Mysql小表驱动大表优化原理
数据库·后端·面试
ShooterJ2 小时前
MySQL基因分片设计方案详解
后端
PetterHillWater2 小时前
ANOVA在软件工程中的应用
后端
cxyxiaokui0012 小时前
还在用 @Autowired 字段注入?你可能正在写出“脆弱”的 Java 代码
java·后端·spring