Skip to content
章节导航

SpringBoot 自动装配

SpringBoot 自动装配的效果

  • 1、添加 spring-boot-starter 依赖
  • 2、在配置文件中编写配置(一部分自动装配的依赖有默认配置)
  • 3、项目启动时,会自动将引入依赖注入到 IOC 容器中,需要使用时直接使用即可

自动装配基本原理

核心机制:@EnableAutoConfiguration

java
// Spring Boot 应用启动入口
@SpringBootApplication  // 这个注解包含 @EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplication 注解的组成

java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration  // 🔥 关键:启用自动配置
@ComponentScan
public @interface SpringBootApplication {
    // ...
}

自动配置的工作流程

  • 1、启动 Spring Boot 应用
  • 2、加载 META-INF/spring.factories 文件,Spring boot 3 是 META-INF/spring.org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件
  • 3、找到所有 org.springframework.boot.autoconfigure.EnableAutoConfiguration 配置
  • 4、根据条件(@Conditional)过滤掉不满足的配置类
  • 5、加载满足条件的自动配置类
  • 6、自动配置类创建相应的 Bean
  • 7、应用启动完成

自动配置的核心注解

@AutoConfiguration 注解

Spring Boot 2.7+ 推荐使用 @AutoConfiguration,标记这是一个自动配置类,@AutoConfiguration 包含 @Configuration

  • 1、@AutoConfiguration 会自动被 Spring Boot 发现和加载
  • 2、通常在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中注册
  • 3、支持自动排序和条件处理
java
@AutoConfiguration  // 标记这是一个自动配置类
@ConditionalOnClass(DataSource.class)  // 当 DataSource 类存在时
@ConditionalOnMissingBean(DataSource.class)  // 且没有 DataSource Bean 时
@EnableConfigurationProperties(DataSourceProperties.class)  // 启用配置属性
public class DataSourceAutoConfiguration {
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource(DataSourceProperties properties) {
        // 自动创建 DataSource Bean
        return properties.initializeDataSourceBuilder().build();
    }
}

Spring Boot 2:spring.factories

java
# META-INF/spring.factories
# 传统方式:在 spring.factories 中声明自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration,\
com.example.AnotherAutoConfiguration

# 自动配置的顺序控制
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
com.example.CustomAutoConfigurationFilter

org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
com.example.CustomAutoConfigurationListener

# 自动配置的排除
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.config.MyAutoConfiguration

Spring Boot 3

Spring Boot 2.7+ 新方式:使用 imports 文件

java
/*
文件位置:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
内容:
com.example.MyAutoConfiguration
*/

// 对应的自动配置类
@AutoConfiguration
public class MyAutoConfiguration {
    // 配置内容
}