SpringBoot--SpringBoot的自动装配
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 →
WebMvcAutoConfigurationDataSource →
DataSourceAutoConfigurationSecurity →
SecurityAutoConfiguration👉 只要加 starter 依赖就能用。
3.2 需要 @EnableXXX 的情况
有些功能 不会默认启用,需要开发者显式声明
@EnableXXX。
典型例子:
@EnableScheduling→ 开启定时任务调度
@EnableAsync→ 开启异步执行
@EnableCaching→ 开启缓存功能👉 这些功能在 Spring Boot 中 没有对应的 AutoConfiguration 或者 出于显式控制的考虑,必须手动启用。
3.3. 常见功能速查表
功能模块 是否需要 @EnableXXX 说明 WebMvc(Spring MVC) ❌ 不需要 有 WebMvcAutoConfigurationDataSource(数据源) ❌ 不需要 有 DataSourceAutoConfigurationSecurity(Spring Security) ❌ 不需要 有 SecurityAutoConfigurationRedis / MongoDB / RabbitMQ ❌ 不需要 对应 starter 有自动装配 Scheduling(定时任务) ✅ 需要 @EnableSchedulingAsync(异步方法执行) ✅ 需要 @EnableAsyncCaching(缓存) ✅ 需要 @EnableCaching自定义功能模块 看情况 如果写了 MyFeatureAutoConfiguration并注册到spring.factories,就不需要@EnableMyFeature
4.@EnableXXX与@Bean的关系
@EnableXXX本质上通过@Import导入配置类,帮你 注册默认 Bean,通常无需自己写@Bean。但如果要定制化,可以写
@Bean来覆盖或增强默认配置。常见例子:
@EnableScheduling
默认注册
ScheduledAnnotationBeanPostProcessor。一般无需写 Bean。
@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; }
@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. 自定义覆盖自动配置
如果你不想用默认的自动配置,有几种方式:
直接写自己的配置类(常用)
例如自己写一个@Bean DataSource,Spring Boot 就不会加载默认的。排除自动配置类
在启动类上加:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})自定义条件配置
使用@ConditionalOnMissingBean保证你的配置优先级更高。
9. 总结
Spring Boot 自动装配核心依赖
@EnableAutoConfiguration。自动配置类由
spring.factories文件加载。使用
@ConditionalXxx注解决定是否生效。默认配置可用,用户配置优先。
可通过
debug=true或 Actuator 查看装配情况。一句话记忆:
👉 Spring Boot 自动装配就是 “根据依赖自动配置默认 Bean,有就用,没有就自动配”。
更多推荐


所有评论(0)