1. 概述
Spring Boot 提供了强大的自动配置机制,能自动加载常见的数据库连接组件,例如 JPA、MongoDB、Redis 等。但在某些场景下,我们并不希望这些自动配置生效,例如:
✅ 单元测试中不需要连接数据库
✅ 项目中使用了自定义的数据源配置
✅ 想要排除某些不必要的依赖启动项以提升启动速度
本文将介绍两种主流方式来禁用 Spring Boot 的数据库自动配置:基于注解的方式 和 基于配置文件的方式,并提供 Redis、MongoDB、JPA 的示例。
2. 使用注解禁用自动配置
这是最常见也最直接的方式,使用 @SpringBootApplication
注解的 exclude
属性来排除特定的自动配置类。
2.1 禁用 MongoDB 自动配置
@SpringBootApplication(exclude = {
MongoAutoConfiguration.class,
MongoDataAutoConfiguration.class
})
这两个类负责自动配置 MongoDB 的连接和数据层,排除后 Spring Boot 不会自动加载 MongoDB 的相关 Bean。
2.2 禁用 Redis 自动配置
@SpringBootApplication(exclude = {
RedisAutoConfiguration.class,
RedisRepositoryAutoConfiguration.class
})
⚠️ 注意:RedisRepositoryAutoConfiguration
是 Spring Data Redis 的自动配置类,如果你使用了 Spring Data Redis 的 Repository 功能,可以一并排除。
2.3 禁用 Spring Data JPA 自动配置
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class
})
这三个类分别负责数据源、事务管理器和 Hibernate 的自动配置,排除后 Spring Boot 不会自动创建数据库连接池和 JPA 相关的 Bean。
3. 使用配置文件禁用自动配置
如果你不想修改 Java 代码,也可以通过 application.properties
或 application.yml
来禁用自动配置。
3.1 禁用 MongoDB 自动配置
spring.autoconfigure.exclude=\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
3.2 禁用 Redis 自动配置
spring.autoconfigure.exclude=\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration
3.3 禁用 Spring Data JPA 自动配置
spring.autoconfigure.exclude=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
✅ 提示:使用这种方式更便于在不同环境(如测试环境)中灵活控制配置,而无需修改代码。
4. 验证是否禁用成功
在测试阶段,可以通过检查 Spring 应用上下文(ApplicationContext)中是否存在某些 Bean 来验证自动配置是否被成功禁用。
4.1 测试 MongoDB 是否被禁用
@Test(expected = NoSuchBeanDefinitionException.class)
public void givenAutoConfigDisabled_whenStarting_thenNoAutoconfiguredBeansInContext() {
context.getBean(MongoTemplate.class);
}
4.2 测试 JPA 是否被禁用
@Test(expected = NoSuchBeanDefinitionException.class)
public void givenAutoConfigDisabled_whenStarting_thenNoAutoconfiguredBeansInContext() {
context.getBean(DataSource.class);
}
4.3 测试 Redis 是否被禁用
@Test(expected = NoSuchBeanDefinitionException.class)
public void givenAutoConfigDisabled_whenStarting_thenNoAutoconfiguredBeansInContext() {
context.getBean(RedisTemplate.class);
}
只要测试通过,说明自动配置已被正确排除。
5. 总结
方式 | 适用场景 | 特点 |
---|---|---|
注解方式 | 配置较少、希望代码直观 | 简洁明了,适合开发阶段 |
配置文件方式 | 多环境配置、希望解耦配置与代码 | 更加灵活,便于部署 |
✅ 推荐做法:在开发阶段使用注解方式快速排除,而在生产或测试环境中使用配置文件方式统一管理。
📌 完整示例代码可在 GitHub 获取:
https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/spring-boot-data