当前位置: 代码网 > it编程>编程语言>Java > SpringBoot中@AutoConfiguration和@Configuration区别

SpringBoot中@AutoConfiguration和@Configuration区别

2025年09月22日 Java 我要评论
@autoconfiguration 是 spring boot 2.4 引入的一个新注解,用于标记自动配置类。它是对传统 @configuration 注解的增强,专门用于自动配置场景。@autoc

@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() default {};
    
    /**
     * 在指定的自动配置类之前处理
     */
    class<?>[] before() default {};
}

3. 与 @configuration 的区别

// 传统方式
@configuration
@conditionalonclass(datasource.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)
public 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},
    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 条件化自动配置

@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 与条件注解配合

@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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com