spring boot 自定义druid数据源,如何注入配置

Posted 不识君的荒漠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot 自定义druid数据源,如何注入配置相关的知识,希望对你有一定的参考价值。

依赖版本

依赖版本如下:

    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.6.11</spring-boot.version>
        <druid-spring-boot-starter.version>1.2.5</druid-spring-boot-starter.version>
    </properties>

替换但不自定义

一般情况下,我们只是替换spring boot默认的数据源为druid,这种情况下,配置文件如下:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initialSize: 10
      minIdle: 1
      maxActive: 20
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat,wall

这种配置是没有问题,相信这种写法在网上一搜都有很多,我们可以验证下,druid的配置是生效的。如下,启动的时候打印druid相关配置信息:

和我们配置文件中是一样,属性配置是成功注入生效的。

替换并自定义

使用druid的时候,我们可以自定义处理某些配置项,比如对数据库连接进行加密等操作。

如下,自定义一个数据源类:

public class CustomDatasource extends DruidDataSource 

    private final DataSourceProperties properties;

    private final boolean unEncrypt;

    public CustomDatasource(DataSourceProperties properties) 
        this.properties = properties;
        String url = this.properties.getUrl();
        unEncrypt = url.contains("mysql") || url.contains("jdbc") || url.contains("localhost") || url.contains("127.0.0.1");
    

    @Override
    public void setPassword(String password) 
        super.setPassword(unEncrypt ? password : AESCoderUtil.decode(password));
    

    @Override
    public void setUsername(String username) 
        super.setUsername(unEncrypt ? username : AESCoderUtil.decode(username));
    

    @Override
    public synchronized void setUrl(String url) 
        super.setUrl(unEncrypt ? url : AESCoderUtil.decode(url));
    

托管spring容器:

@Configuration
public class DatasourceConfiguration 

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource getDataSource(DataSourceProperties properties) 
        DruidDataSource druidDataSource = new CustomDatasource(properties);
        return druidDataSource;
    

查看druid的自动配置,可以看到自定义数据源的bean存在,druid便不再创建数据源bean:

 

 但是如果还以上面配置文件的方式配置druid的属性是不生效的,如下:

与配置文件的值不一致。

这是因为我们指定注入属性前缀是spring.datasource,所以修改配置如下:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
#    druid:
    initialSize: 10
    minIdle: 1
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    filters: stat,wall

 注意看注释的地方,这样就可以了。

对于一个新手,如果只是通过网络搜索资料就进行配置,万一没有配置正确并且忽略这个细节,自己不进行验证是很难发现这个配置不生效的。

以上是关于spring boot 自定义druid数据源,如何注入配置的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 自定义数据源 DruidDataSource

数据源组件druid filter的扩展机制及spring boot 环境下的几种配置方式

如何为 Spring Boot Rest 使用自定义异常?

spring-boot 速成 druid+mybatis 多数据源及读写分离的处理

Spring Boot 使用阿里巴巴 Druid 数据源

Spring Boot [使用 Druid 数据库连接池]