开发者

SpringBoot中@AutoConfiguration和@Configuration区别

目录
  • @AutoConfiguration 注解详解
    • 1. 基本作用
    • 2. 注解定义
    • 3. 与 @Configuration 的区别
    • 4. 主要特性
      • 4.1 明确的语义(使用@Configuration的类只知道是一个配置类,并不知道是自动配置类)
      • 4.2 排序控制
    • 5. 实际应用示例
      • 5.1 基础自动配置类
      • 5.2 带排序的自动配置(决定当前自动配置类,在谁创建之前或者之后配置)
      • 5.3 条件化自动配置
    • 6. 与其他注解的配合使用
      • 6.1 与条件注解配合
      • 6.2 与属性配置注解配合
    • 7. 优势和特点
      • 7.1 语义明确
      • 7.2 排序支持
      • 7.3 与Spring Boot生态系统集成
    • 8. 完整示例
      • 9. 最佳实践

      @AutoConfiguration 是 Spring Boot 2.4 引入的一个新注解,用于标记自动配置类。它是对传统 @Configuration 注解的增强,专门用于自动配置场景。

      @AutoConfiguration 注解详解

      1. 基本作用

      @AutoConfiguration 是一个复合注解,主要用于标识自动配置类,它提供了比 @Configuration 更明确的语义和更好的功能。

      2. 注解定义

      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Configuration
      public @interface AutoConfiguration {
          
          /**
           * 自动配置类的处理顺序
           */
          AutoConfigurationPhase before() default AutoConfigurationPhase.NONE;
          
          /**
           * 在指定的自动配置类之后处理
           */
          Class<?>[] after()android default {};
          
          /**
           * 在指定的自动配置类之前处理
           */
          Class<?>[] before() default {};
      }
      

      3. 与 @Configuration 的区别

      // 传统方式
      @Configuration
      @ConditionalOnClass(DataSoupythonrce.class)
      @EnableConfigurationProperties(DataSourceProperties.class)
      public class DataSourceAutoConfiguration {
          // 配置内容
      }
      
      // 新方式(推荐)
      @AutoConfiguration
      @ConditionalOnClass(DataSource.class)
      @EnableConfigurationProperties(DataSourceProperties.class)
      public class DataSourceAutoConfiguration {
          // 配置内容
      }
      

      4. 主要特性

      4.1 明确的语义(使用@Configuration的类只知道是一个配置类,并不知道是自动配置类)

      // 明确表示这是一个自动配置类
      @AutoConfiguration
      @ConditionalOnClass(RedisTemplate.class)
      publicwww.devze.com class RedisAutoConfiguration {
          
          @Bean
          @ConditionalOnMissingBean
          public RedisTemplate redisTemplate() {
              return new RedisTemplate();
          }
      }
      

      4.2 排序控制

      // 控制自动配置的执行顺序
      @AutoConfiguration(
          before = DataSourceAutoConfiguration.class,
          after = WebMvcAutoConfiguration.class
      )
      @ConditionalOnClass(DataSource.class)
      public class CustomDataSourceAutoConfiguration {
          // 配置内容
      }
      

      5. 实际应用示例

      5.1 基础自动配置类

      @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 带排序的自动配置(决定当前自动配置类,在谁创建之前或者之后配置)

      @AutoConfiguration(
          before = {DataSourceAutoConfiguration.class},
          af编程ter = {WebMvcAutoConfiguration.class}
      )
      @ConditionalOnClass(CacheManager.class)
      @EnableConfigurationProperties(CacheProperties.class)
      public class CacheAutoConfiguration {
          
          @Bean
          @ConditionalOnMissingBean
          public CacheManager cacheManager(CacheProperties properties) {
              return new CustomCacheManager(properties);
          }
      }
      

      5.3 条件化自动配置

      @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();
          }
        php  
          @Bean
          public WebFilter webFilter() {
              return new WebFilter();
          }
      }
      

      6. 与其他注解的配合使用

      6.1 与条件注解配合

      @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 与属性配置注解配合

      @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 排序支持

      @AutoConfiguration(
          before = DataSourceAutoConfiguration.class,
          after = WebMvcAutoConfiguration.class
      )
      

      7.3 与Spring Boot生态系统集成

      • spring.factoriesAutoConfiguration.imports 文件配合使用
      • 支持Spring Boot的条件化配置机制

      8. 完整示例

      // 自定义属性配置类
      @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+推荐的标准做法。

      到此这篇关于 SpringBoot中@AutoConfiguration和@Configuration区别的文章就介绍到这了,更多相关 SpringBoot @AutoConfiguration @Configuration内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜