原生的SpringBoot 的数据库配置在DataSourceAutoConfiguration类中
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory") //非响应式数据源
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class }) // 池化继续相关配置
public class DataSourceAutoConfiguration {
// 静态内部类定义的池化技术的导入
@Configuration(proxyBeanMethods = false)
@Conditional(PooledDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,
DataSourceJmxConfiguration.class }) // 默认导入了各种池化技术 但是starter默认只引入了Hikari
protected static class PooledDataSourceConfiguration {
}
}
// 自动装配Hikari
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
matchIfMissing = true)
static class Hikari {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
HikariDataSource dataSource(DataSourceProperties properties) {
HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
if (StringUtils.hasText(properties.getName())) {
dataSource.setPoolName(properties.getName());
}
return dataSource;
}
}
以我们常用的Druid数据库连接池为例 分析SpringBoot关于数据库相关的自动配置
找spring.factories的自动配置类
先分析Druid的DruidDataSourceAutoConfigure类 类本身不复杂
- @ConditionalOnClass(DruidDataSource.class)必须有DruidDataSource包才加载
- @AutoConfigureBefore(DataSourceAutoConfiguration.class) 必须在DataSourceAutoConfiguration之前配置 因为 DataSourceAutoConfiguration默认是配置的HikariDataSource数据源 所以这里必须在之前配置
- @EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class}) 开启了一些配置信息的数据项绑定
- @Import下的4个Configuration
- DruidSpringAopConfiguration Druid对SpringAOP的支持自动配置 可以自定匹配一些Spring组件的SQL监控规则 详细参考Druid和Spring关联监控配置
- DruidStatViewServletConfiguration 自动化配置StatServlet视图 参考配置_StatFilter
- DruidWebStatFilterConfiguration 监控规则相关自动化配置
- DruidFilterConfiguration 防火墙相关的自动化配置 配置-wallfilter
@Configuration
@ConditionalOnClass(DruidDataSource.class) // 包检查
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class,
DruidStatViewServletConfiguration.class,
DruidWebStatFilterConfiguration.class,
DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);
@Bean(initMethod = "init") //初始化方法
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
// new DruidDataSource的包装类 调用了init方法
return new DruidDataSourceWrapper();
}
}
init在父类的DruidDataSource中,该方法定义了Druid的各种初始化操作并返回
常见Druid配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: admin
url: jdbc:mysql://localhost:3306/spring_tutorial
druid:
# 开启的filter
filters: wall,stat # 开启 防火墙和 state
enable: true
stat-view-servlet:
enabled: true # 是否开启 web 页面监控平台 默认false
# loginUsername: admin # 开启监控 登录用户米密码
# login-password: 1
filter:
stat: # 监控相关配置
slow-sql-millis: 3000 # 慢SQL时间阈值.
web-stat-filter: # 基于web请求的监控
enabled: true
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' #需要排除的
url-pattern: /* # 需要/*的形式底层是filter
aop-patterns: com.corn.turorial.spring.controller.* # 基于Spring AOP 的监控