SpringBoot自动化配置数据库原理

原生的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的自动配置类

image-20210208175605846

image-20210208175556179

先分析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 的监控
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值