SpringBoot的常用注解

@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,性能更好、结构更清晰。