@AutoConfiguration

一、作用

@AutoConfiguration 是 SpringBoot 自动配置类标记的注解,告诉 Spring:当前类是自动配置类,容器启动时根据条件自动装配 Bean,无需手动写 XML / @Bean 配置。替代早期 @Configuration + SPI 自动加载逻辑,SpringBoot 2.7+ 官方主推

二、注解本质与源码说明

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration(
    proxyBeanMethods = false
)
@AutoConfigureBefore
@AutoConfigureAfter
public @interface AutoConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    String value() default "";

    @AliasFor(
        annotation = AutoConfigureBefore.class,
        attribute = "value"
    )
    Class<?>[] before() default {};

    @AliasFor(
        annotation = AutoConfigureBefore.class,
        attribute = "name"
    )
    String[] beforeName() default {};

    @AliasFor(
        annotation = AutoConfigureAfter.class,
        attribute = "value"
    )
    Class<?>[] after() default {};

    @AliasFor(
        annotation = AutoConfigureAfter.class,
        attribute = "name"
    )
    String[] afterName() default {};
}

常见元注解‌:
@Retention:指定注解的生命周期(源码SOURCE、字节码CLASS(default)、运行时RUNTIME)。
@Target:指定注解可以修饰的程序元素(类、方法、字段等)。
@Documented:指定该注解包含在 Javadoc 中。
@Inherited:指定子类可以继承父类的注解。

@Configuration 注解用于标记一个类作为配置类,这个类中可以包含一些@Bean注解的方法,这些方法将会被Spring容器管理。当你在一个类上使用@Configuration注解时,Spring会处理这个类中的方法,并为它们创建bean定义。

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

@Configuration注解中,proxyBeanMethods属性用来控制是否应该为@Configuration类中的@Bean方法创建CGLIB代理。默认情况下,这个属性是true,意味着Spring会为每个@Bean方法创建一个代理,这样可以确保每次调用时都返回一个新的bean实例。如果你将proxyBeanMethods设置为false,那么每个@Bean方法将直接被调用,不会创建代理,这在某些情况下可以提高性能。

@Configuration(proxyBeanMethods = false)
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

@AutoConfiguration自带 @Configuration:类内部可以写 @Bean、@Conditional 条件注解;
专门用于spring-boot-autoconfigure 内置自动配置(如 KafkaAutoConfiguration、WebMvcAutoConfiguration);
区别普通 @Configuration:
@Configuration:业务自定义配置、手动 @Import 或扫描生效;
@AutoConfiguration:SPI 机制自动发现、项目启动自动加载。

@AutoConfiguration注解定义上面的两个

@AutoConfigureBefore

@AutoConfigureAfter

这里只是规定所有使用 @AutoConfiguration 的自动配置类的默认加载时序基准,给整个自动配置体系提供全局顺序约束。这里没有针对具体业务的自动配置类

@ConfigurationProperties(
    prefix = "spring.kafka"
)

@ConfigurationProperties这个注解有一个prefix属性,凡是application.yml或application.propertis配置中以prefix开头的配置都会提取并注入到该配置类中。

三、加载机制(核心流程)
在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中,写入全限定类名;
SpringBoot 启动时,AutoConfigurationImportSelector 读取该文件,批量导入所有 @AutoConfiguration 类;
自动配置类配合条件注解实现按需装配:
@ConditionalOnClass:类路径存在指定类才装配(例如 spring-kafka 存在才启用 Kafka 自动配置)
@ConditionalOnMissingBean:容器没有用户自定义 Bean 时,才创建默认 Bean
@ConditionalOnProperty:配置文件存在指定配置才生效
四、结合 Kafka 场景举例
KafkaAutoConfiguration 源码核心逻辑:
@AutoConfiguration
@ConditionalOnClass(KafkaTemplate.class)
public class KafkaAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean // 你自己不创建KafkaTemplate,框架才自动生成
    public KafkaTemplate<?, ?> kafkaTemplate(KafkaProducerFactory<?, ?> kafkaProducerFactory) {
        return new KafkaTemplate<>(kafkaProducerFactory);
    }
}
流程:
项目引入 spring-kafka 依赖 → 类路径有 KafkaTemplate;
自动配置类被加载;
容器没有手动 new KafkaTemplate,框架自动创建;
读取 application.yml 里 spring.kafka 配置注入工厂;
业务代码直接 @Resource KafkaTemplate 注入使用,不用自己写生产者工厂、序列化器。
五、@AutoConfiguration和 @Configuration 的关键区别
注解    使用场景    加载方式
@Configuration    业务自定义配置类    组件扫描(@SpringBootApplication 扫包)、手动 @Import
@AutoConfiguration    SpringBoot 框架内置自动配置    SPI 文件自动导入,全局统一加载
六、使用场景
SpringBoot 官方 starter 内部自动配置类(web、kafka、redis、jdbc 等);
自定义 starter 开发,封装通用组件自动装配;
普通业务项目几乎不用自己写,只需要引入 starter 依赖自动生效。
七、关闭某个自动配置
启动类 @SpringBootApplication 排除指定自动配置:
java
运行
@SpringBootApplication(exclude = KafkaAutoConfiguration.class)
public class DemoApplication {
}
排除后,需要你手动声明 KafkaTemplate、生产者工厂 Bean。
八、补充:2.7 版本改动
SpringBoot 2.7 之前自动配置文件是 META-INF/spring.factories;
2.7 废弃 spring.factories,改用 AutoConfiguration.imports 文件,搭配 @AutoConfiguration,性能更好、结构更清晰。

更多推荐