@AutoConfiguration
一、作用
@AutoConfiguration 是 SpringBoot 自动配置类标记的注解 ,告诉 Spring:当前类是自动配置类,容器启动时根据条件自动装配 Bean,无需手动写 XML / @Bean 配置。替代早期 @Configuration + SPI 自动加载逻辑,SpringBoot 2.7+ 官方主推
二、注解本质与源码说明
java
@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定义。
java
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
在@Configuration注解中,proxyBeanMethods属性用来控制是否应该为@Configuration类中的@Bean方法创建CGLIB代理。默认情况下,这个属性是true,意味着Spring会为每个@Bean方法创建一个代理,这样可以确保每次调用时都返回一个新的bean实例。如果你将proxyBeanMethods设置为false,那么每个@Bean方法将直接被调用,不会创建代理,这在某些情况下可以提高性能。
java
@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,性能更好、结构更清晰。