Spring Boot 默认按 classpath 顺序选择连接池:优先 HikariCP,其次 Tomcat JDBC、DBCP2;Druid 需显式配置 type 或引入对应 starter(3.x 用 druid-spring-boot-3-starter)。

Spring Boot 自动配置连接池,核心是靠 spring-boot-autoconfigure 模块里的 DataSourceAutoConfiguration 类完成的——它不是“猜”,而是按规则一步步判断、装配。
关键逻辑就一条:谁先注册、谁被选中,取决于 classpath 里有什么 + 配置里指定了什么。
Spring Boot 怎么决定用哪个连接池
- 默认情况下,Spring Boot 会扫描 classpath:
- 如果发现
HikariDataSource(即 HikariCP 在 classpath),就自动装配 HikariCP,无需任何配置; - 如果没找到 HikariCP,再依次检查
TomcatJdbcDataSource(Tomcat JDBC Pool)、BasicDataSource(DBCP2)等; - Druid 不在默认检测链里,所以必须显式“告诉” Spring Boot:我要用 Druid。
- 如果发现
怎么告诉?两种方式:
-
✅ 推荐:在
application.yml中指定类型立即学习“Java免费学习笔记(深入)”;
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource只要 classpath 有
druid-spring-boot-starter(或druid核心包),这个配置就会触发 Druid 的自动装配。 ✅ 或者:引入
druid-spring-boot-starter(对 Spring Boot 2.x)或druid-spring-boot-3-starter(对 Spring Boot 3.x+)
它自带DruidDataSourceAutoConfigure,通过@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.alibaba.druid.pool.DruidDataSource")等条件,确保只要类型匹配或未显式禁用,就自动生效。
注意:Spring Boot 3 使用 Jakarta EE 命名空间(
jakarta.sql.*),所以必须用druid-spring-boot-3-starter,否则会报ClassNotFoundException: javax.sql.DataSource。
自动配置到底做了什么
以 Druid 为例,DruidDataSourceAutoConfigure 主要干三件事:
- 创建
DruidDataSourceBean,并把spring.datasource.druid.*配置项(如initial-size、max-active)自动绑定进去; - 启用内置 Filter(如
stat统计、wall防注入),只要配置了druid.filters=stat,wall; - 如果开启了监控(如
spring.datasource.druid.stat-view-servlet.enabled=true),就自动注册StatViewServlet和WebStatFilter,暴露/druid/*页面。
这些都不用手写 @Bean 方法,纯靠 starter + 配置驱动。
为什么有时候配置不生效
常见原因有这几个:
- 引入了
druid-spring-boot-starter,但项目是 Spring Boot 3.x → 应换为druid-spring-boot-3-starter; -
spring.datasource.type写成了com.alibaba.druid.pool.DruidDataSource,但 classpath 没有 Druid 包 → 启动失败或回退到 Hikari; - 多数据源场景下,只配了
spring.datasource.*,没加@Primary或没按druid.master.*/druid.slave.*分组 → 自动配置找不到主数据源; - 配置项前缀写错:比如用了
spring.datasource.initial-size(这是 Hikari 的),而 Druid 必须用spring.datasource.druid.initial-size。
你可以完全跳过自动配置吗
可以,但没必要。
手动写 @Configuration + @Bean 创建 DruidDataSource,虽然灵活,但得自己处理:
- 属性绑定(要用
@ConfigurationProperties); - Filter 注册(
druidDataSource.setFilters("stat,wall")); - 监控 Servlet 和 Filter 的
ServletRegistrationBean/FilterRegistrationBean注册; - 还要确保不和
DataSourceAutoConfiguration冲突(通常得@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class))。
starter 的价值,就是把这些模板代码全收走,只留配置。
不复杂但容易忽略。


















