如何通过exclude = DataSourceAutoConfiguration.class禁止Spring Boot配置数据源
2023-11-20 22:04:20
禁用 Spring Boot 自动数据源配置:消除微服务混乱
当你在分布式项目中使用 Spring Boot 时,你可能会遇到一个问题:即使你在微服务的启动类上使用了 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
注解,数据源配置仍然会出现。这显然不是你想要的,因为你的目标是让 Spring Boot 不要自动配置数据源。
那么,如何解决这个问题呢?
秘诀在于在子项目的启动类中添加 DruidDataSourceAutoConfigure.class
。
Spring Boot 通常会自动为你配置数据源。但在某些情况下,你需要手动禁用 Spring Boot 的自动数据源配置,例如在分布式项目中,各个微服务之间不需要共享同一个数据源。如果你在微服务中使用 Spring Boot 自动配置的数据源,就会导致数据源的连接混乱,从而出现问题。
为了避免这个问题,你需要在启动类上使用 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
注解,以禁止 Spring Boot 自动配置数据源。但这样做有时并不能完全解决问题,因为子项目继承了父项目中的配置,导致 DruidDataSourceAutoConfigure.class
仍然会被扫描到,从而导致数据源的配置再次被启用。
因此,为了彻底禁用 Spring Boot 的自动数据源配置,除了在父项目的启动类上使用 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
注解外,还需要在子项目的启动类上使用 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
注解。这样,Spring Boot 就不会再自动配置数据源了。
步骤:
- 在父项目的启动类上使用
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
注解。 - 在子项目的启动类上使用
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
注解。
代码示例:
父项目启动类:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class ParentProjectApplication {
public static void main(String[] args) {
SpringApplication.run(ParentProjectApplication.class, args);
}
}
子项目启动类:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
public class ChildProjectApplication {
public static void main(String[] args) {
SpringApplication.run(ChildProjectApplication.class, args);
}
}
需要注意的是:
exclude
注解只能禁用 Spring Boot 自动配置的组件,而不能禁用 Spring Boot 加载的组件。- 如果在子项目的启动类上只使用
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
注解,而没有使用@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
注解,那么DruidDataSourceAutoConfigure.class
仍然会被扫描到,从而导致数据源的配置再次被启用。 - 如果在父项目和子项目中都使用
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
注解,那么 Spring Boot 将不会自动配置任何数据源。
常见问题解答
1. 为什么我需要在子项目的启动类上添加 DruidDataSourceAutoConfigure.class
?
因为 Spring Boot 会从父项目继承配置,而 DruidDataSourceAutoConfigure.class
可能在父项目的 classpath 中。
2. 我可以使用其他注解来禁用 Spring Boot 的自动数据源配置吗?
是的,你还可以使用 @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
注解。
3. 如果我在父项目中禁用了自动数据源配置,那么在子项目中是否还需要禁用?
是的,你仍然需要在子项目中禁用,因为子项目会继承父项目的配置。
4. 禁用自动数据源配置后,我该如何手动配置数据源?
你可以使用 @Bean
注解手动配置数据源,或在 application.properties
文件中配置。
5. 禁用自动数据源配置有什么好处?
禁用自动数据源配置可以避免微服务之间的数据源连接混乱,从而提高项目的稳定性和可靠性。