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


    依赖版本

    依赖版本如下:

    1. <properties>
    2. <java.version>1.8java.version>
    3. <spring-boot.version>2.6.11spring-boot.version>
    4. <druid-spring-boot-starter.version>1.2.5druid-spring-boot-starter.version>
    5. properties>

    替换但不自定义

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

    1. spring:
    2. datasource:
    3. driver-class-name: com.mysql.cj.jdbc.Driver
    4. url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true
    5. username: root
    6. password: 123456
    7. type: com.alibaba.druid.pool.DruidDataSource
    8. druid:
    9. initialSize: 10
    10. minIdle: 1
    11. maxActive: 20
    12. maxWait: 60000
    13. timeBetweenEvictionRunsMillis: 60000
    14. minEvictableIdleTimeMillis: 300000
    15. validationQuery: SELECT 1
    16. testWhileIdle: true
    17. testOnBorrow: false
    18. testOnReturn: false
    19. poolPreparedStatements: true
    20. maxPoolPreparedStatementPerConnectionSize: 20
    21. filters: stat,wall

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

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

    替换并自定义

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

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

    1. public class CustomDatasource extends DruidDataSource {
    2. private final DataSourceProperties properties;
    3. private final boolean unEncrypt;
    4. public CustomDatasource(DataSourceProperties properties) {
    5. this.properties = properties;
    6. String url = this.properties.getUrl();
    7. unEncrypt = url.contains("mysql") || url.contains("jdbc") || url.contains("localhost") || url.contains("127.0.0.1");
    8. }
    9. @Override
    10. public void setPassword(String password) {
    11. super.setPassword(unEncrypt ? password : AESCoderUtil.decode(password));
    12. }
    13. @Override
    14. public void setUsername(String username) {
    15. super.setUsername(unEncrypt ? username : AESCoderUtil.decode(username));
    16. }
    17. @Override
    18. public synchronized void setUrl(String url) {
    19. super.setUrl(unEncrypt ? url : AESCoderUtil.decode(url));
    20. }
    21. }

    托管spring容器:

    1. @Configuration
    2. public class DatasourceConfiguration {
    3. @Bean
    4. @ConfigurationProperties(prefix = "spring.datasource")
    5. public DataSource getDataSource(DataSourceProperties properties) {
    6. DruidDataSource druidDataSource = new CustomDatasource(properties);
    7. return druidDataSource;
    8. }
    9. }

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

     

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

    与配置文件的值不一致。

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

    1. spring:
    2. datasource:
    3. driver-class-name: com.mysql.cj.jdbc.Driver
    4. url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true
    5. username: root
    6. password: 123456
    7. type: com.alibaba.druid.pool.DruidDataSource
    8. # druid:
    9. initialSize: 10
    10. minIdle: 1
    11. maxActive: 20
    12. maxWait: 60000
    13. timeBetweenEvictionRunsMillis: 60000
    14. minEvictableIdleTimeMillis: 300000
    15. validationQuery: SELECT 1
    16. testWhileIdle: true
    17. testOnBorrow: false
    18. testOnReturn: false
    19. poolPreparedStatements: true
    20. maxPoolPreparedStatementPerConnectionSize: 20
    21. filters: stat,wall

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

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

  • 相关阅读:
    华为机试 - 无向图染色
    二叉树理论基础
    Nebula Siwi:基于图数据库的智能问答助手思路分析
    实在智能“信创RPA”完成国产化流程全适配,加入ISV华为鲲鹏展翅伙伴
    University of BRISTOL
    Mysql中char和varchar的区别详细剖析
    msvc编译器编码错误解决方案
    时间戳的理解
    202104-2邻域均值
    C# dll代码混淆加密
  • 原文地址:https://blog.csdn.net/x763795151/article/details/127759467