1. 自动装配的概念

             Spring Boot 的核心目标是 简化配置,减少 XML 配置或繁琐的 @Bean 注册。(对于减少,减少 XML 配置或繁琐的 @Bean 注册不理解可以去看3.和4.知识点)
             通过 自动装配(Auto Configuration) 机制,Spring Boot 会根据 类路径下的依赖、配置文件、运行环境,自动为项目提供合适的默认配置。

一句话总结:
👉 “约定大于配置,有需要时再覆盖默认配置”。


2. 自动装配的核心注解

2.1 @SpringBootApplication

入口类常见写法:

它是一个组合注解,主要包含:

  • @SpringBootConfiguration → 本质是 @Configuration,表示当前类是配置类。

  • @EnableAutoConfiguration开启自动装配核心注解

  • @ComponentScan → 自动扫描当前包及子包中的 @Component@Service@Controller 等。


2.2 @EnableAutoConfiguration

这是自动装配的 关键
它会触发 SpringFactoriesLoader 去加载 所有在 META-INF/spring.factories 中声明的自动配置类

例如:


   spring-boot-autoconfigure 包下有一个 spring.factories 文件,里面定义了大量自动配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
...

这些类就是 Spring Boot 启动时会加载的 自动配置类


3.@EnableXXX 和自动装配的关系

3.1 不需要 @EnableXXX 的情况

如果某个功能 已经有对应的 XXXAutoConfiguration 并在 spring.factories 中声明,那么只需引入相关依赖即可,无需手动添加 @EnableXXX

  • WebMvc → WebMvcAutoConfiguration

  • DataSource → DataSourceAutoConfiguration

  • Security → SecurityAutoConfiguration

👉 只要加 starter 依赖就能用。

3.2 需要 @EnableXXX 的情况

有些功能 不会默认启用,需要开发者显式声明 @EnableXXX
典型例子:

  • @EnableScheduling → 开启定时任务调度

  • @EnableAsync → 开启异步执行

  • @EnableCaching → 开启缓存功能

👉 这些功能在 Spring Boot 中 没有对应的 AutoConfiguration 或者 出于显式控制的考虑,必须手动启用。

3.3. 常见功能速查表

功能模块 是否需要 @EnableXXX 说明
WebMvc(Spring MVC) ❌ 不需要 WebMvcAutoConfiguration
DataSource(数据源) ❌ 不需要 DataSourceAutoConfiguration
Security(Spring Security) ❌ 不需要 SecurityAutoConfiguration
Redis / MongoDB / RabbitMQ ❌ 不需要 对应 starter 有自动装配
Scheduling(定时任务) ✅ 需要 @EnableScheduling
Async(异步方法执行) ✅ 需要 @EnableAsync
Caching(缓存) ✅ 需要 @EnableCaching
自定义功能模块 看情况 如果写了 MyFeatureAutoConfiguration 并注册到 spring.factories,就不需要 @EnableMyFeature

4.@EnableXXX@Bean 的关系

  • @EnableXXX 本质上通过 @Import 导入配置类,帮你 注册默认 Bean,通常无需自己写 @Bean

  • 但如果要定制化,可以写 @Bean 来覆盖或增强默认配置。

常见例子:

  1. @EnableScheduling
    • 默认注册 ScheduledAnnotationBeanPostProcessor

    • 一般无需写 Bean。

  2. @EnableAsync
    • 默认线程池是 SimpleAsyncTaskExecutor(性能差)。

    • 需要自己写 @Bean 提供更好的线程池:

      @Bean("taskExecutor")
      public Executor taskExecutor() {
          ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
          executor.setCorePoolSize(5);
          executor.setMaxPoolSize(10);
          executor.setQueueCapacity(25);
          executor.initialize();
          return executor;
      }
      
  3. @EnableCaching
    • 默认使用 SimpleCacheManager

    • 如果要用 Redis 缓存,需要自己写:

      @Bean
      public CacheManager cacheManager(RedisConnectionFactory factory) {
          return RedisCacheManager.builder(factory).build();
      }
      

5. 自动配置类原理

一个典型的自动配置类(以数据源为例):

@Configuration
@ConditionalOnClass(DataSource.class)  // 当类路径下存在 DataSource 类时生效
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定 application.yml 的配置
public class DataSourceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean  // 用户没有手动声明 DataSource Bean 时才生效
    public DataSource dataSource(DataSourceProperties properties) {
        return DataSourceBuilder.create()
                .url(properties.getUrl())
                .username(properties.getUsername())
                .password(properties.getPassword())
                .build();
    }
}

这里几个重要的 条件注解

  • @ConditionalOnClass → 类存在才生效

  • @ConditionalOnMissingBean → 如果用户没自定义才生效

  • @ConditionalOnProperty → 配置文件中存在某个属性才生效

这就是 默认配置可用,用户配置优先 的机制。


6. 如何查看生效的自动配置

Spring Boot 提供了一个调试工具:

  • application.properties 中加:

debug=true

启动时会输出:
✅ 生效的自动配置
❌ 没有生效的自动配置(以及原因)

另外,也可以用 spring-boot-actuator,访问 /actuator/conditions 查看详细条件。


7. 常见自动配置

  • WebMvcAutoConfiguration → Spring MVC 默认配置(静态资源映射、消息转换器等)。

  • DataSourceAutoConfiguration → 数据源默认配置。

  • JpaRepositoriesAutoConfiguration → JPA 仓库支持。

  • SecurityAutoConfiguration → Spring Security 默认拦截规则。

  • RedisAutoConfiguration → 自动配置 RedisTemplate。


8. 自定义覆盖自动配置

如果你不想用默认的自动配置,有几种方式:

  1. 直接写自己的配置类(常用)

     例如自己写一个 @Bean DataSource,Spring Boot 就不会加载默认的。
  2. 排除自动配置类
    在启动类上加:

    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    
  3. 自定义条件配置
    使用 @ConditionalOnMissingBean 保证你的配置优先级更高。


9. 总结

  • Spring Boot 自动装配核心依赖 @EnableAutoConfiguration

  • 自动配置类由 spring.factories 文件加载。

  • 使用 @ConditionalXxx 注解决定是否生效。

  • 默认配置可用,用户配置优先。

  • 可通过 debug=true 或 Actuator 查看装配情况。

一句话记忆:
👉 Spring Boot 自动装配就是 “根据依赖自动配置默认 Bean,有就用,没有就自动配”。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐