【Spring Boot】整合druid数据源

一、闲话

国庆回来搬家去了,还联系上了七天班,所以偷懒了,今天继续学习Spring Boot

二、自定义整合方式

Spring Boot整合第三方技术有2种方式:自定义方式和利用starter

我们先了解一下自定义方式,首先引入相关依赖

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.1.17</version>
</dependency>

然后声明一个配置类,使用@Bean注入一个DataSource类型的组件

在上一篇博客【Spring Boot】DataSource数据源的自动配置解析中,我们通过分析DataSourceAutoConfiguration可以得知,系统的默认数据源HikariDataSource生效要求系统中没有DataSource.class类型的bean

package com.decade.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class MyDataSourceConfig {

    @Bean
    // 也可以使用@ConfigurationProperties注解直接获取配置文件中的属性
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        final DruidDataSource druidDataSource = new DruidDataSource();
        // 可以自己设置数据源相关属性
        // druidDataSource.setUrl("");
        // druidDataSource.setUsername("");
        // druidDataSource.setPassword("");
        return druidDataSource;
    }
}

然后我们使用之前的测试类进行测试

package com.decade;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@SpringBootTest
@Slf4j
class SpringbootWebApplicationTests {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private DataSource dataSource;

    @Test
    void contextLoads() {
        final Long count = jdbcTemplate.queryForObject("select count(*) from t_decade_user", Long.class);
        log.info("该表中数据总数为{}", count);
        log.info("系统使用的数据源为:{}", dataSource.getClass().getName());
    }
}

验证效果如下,查询数据正常且使用的是druid数据源
在这里插入图片描述

除了基本的连接配置,druid还提供了很多其他的功能,可以参考官方文档

1、内置的监控页面

在以前的SSM框架的项目中,我们需要在web.xml文件中配置一个servlet
在这里插入图片描述
现在使用Spring Boot框架之后,这些都可以交给配置类来做
参考之前的博客【Spring Boot】Web原生组件注入
我们可以使用ServletRegistrationBean将Servlet注册到容器中

@Bean
public ServletRegistrationBean statViewServlet() {
	final StatViewServlet statViewServlet = new StatViewServlet();
	final ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(statViewServlet, "/druid/*");
	// 设置监控页的登录账号
	servletRegistrationBean.addInitParameter("loginUsername", "user");
	servletRegistrationBean.addInitParameter("loginPassword", "123456");
	return servletRegistrationBean;
}

然后我们就可以通过http://localhost:8080/druid/index.html访问druid的内置监控页面
在这里插入图片描述

在这里插入图片描述

2、开启SQL监控统计功能stat

在这里插入图片描述
和防火墙wall
在这里插入图片描述

根据druid的官方文档可知,开启SQL监控和防火墙需要设置过滤器,所以我们还是要调整配置类

@Bean
    // 也可以使用@ConfigurationProperties注解直接获取配置文件中的属性
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() throws SQLException {
        final DruidDataSource druidDataSource = new DruidDataSource();
        // 可以自己设置数据源相关属性
        // druidDataSource.setUrl("");
        // druidDataSource.setUsername("");
        // druidDataSource.setPassword("");
        // 开启监控功能
        druidDataSource.setFilters("stat,wall");
        return druidDataSource;
    }

接着我们写一个接口去测试一下

@Autowired
private JdbcTemplate jdbcTemplate;

@GetMapping("/query")
@ResponseBody
public String queryInfo() {
	final Long count = jdbcTemplate.queryForObject("select count(*) from t_decade_user", Long.class);
	return String.valueOf(count);
}

调用接口后,可以查看到SQL的执行情况
在这里插入图片描述
以及防火墙
在这里插入图片描述

3、配置web和jdbc的监控

在这里插入图片描述
我们需要在配置类中定义一个过滤器,设置要监控的请求路径

@Bean
public FilterRegistrationBean webStatFilter() {
	final WebStatFilter webStatFilter = new WebStatFilter();
	final FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
	webStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
	webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
	return webStatFilterFilterRegistrationBean;
}

执行上面的/query请求后,效果如下
在这里插入图片描述

此外,druid还有监控spring等配置,具体的可以参考上面的文档,然后通过配置类实现原来xml文件同样的配置

三、使用starter启动器整合

使用starter启动器也可以整合druid数据源
我们只需要导入相关依赖即可

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-starter</artifactId>
	<version>1.1.17</version>
</dependency>

然后我们可以看下对应自动配置类的代码

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.alibaba.druid.spring.boot.autoconfigure;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
import com.alibaba.druid.spring.boot.autoconfigure.stat.DruidFilterConfiguration;
import com.alibaba.druid.spring.boot.autoconfigure.stat.DruidSpringAopConfiguration;
import com.alibaba.druid.spring.boot.autoconfigure.stat.DruidStatViewServletConfiguration;
import com.alibaba.druid.spring.boot.autoconfigure.stat.DruidWebStatFilterConfiguration;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
// 当系统中存在DruidDataSource类型的组件时才会生效
@ConditionalOnClass({DruidDataSource.class})
// 在系统默认的数据源自动配置类之前生效
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
// 配置项以spring.datasource.druid和spring.datasource开头
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
// 自定义整合方式中开启SQL监控、防火墙等配置都在这些类中
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
    private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);

    public DruidDataSourceAutoConfigure() {
    }

    @Bean(
        initMethod = "init"
    )
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        LOGGER.info("Init DruidDataSource");
        return new DruidDataSourceWrapper();
    }
}

分析完相关源码之后,我们就可以通过配置项来实现和上面自定义整合方式相同的功能了

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/decade_test?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

    druid:
      aop-patterns: com.decade.*  #监控SpringBean
      filters: stat,wall     # 底层开启功能,stat(sql监控),wall(防火墙)

      stat-view-servlet: # 配置监控页功能
        enabled: true
        login-username: user #监控页登录账号
        login-password: 123456 # 监控页登陆密码
        resetEnable: true #重置按钮是否生效

      web-stat-filter: # 监控web
        enabled: true
        urlPattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'


      filter:
        stat: # 对上面filters里面的stat的详细配置,也就是SQL监控的配置
          slow-sql-millis: 1000 # 慢SQL的时间,1000ms
          logSlowSql: true # 记录慢SQL
          enabled: true
        wall: # 防火墙相关设置
          enabled: true
          config:
            drop-table-allow: false # 禁止删表操作

验证结果如下,druid相关功能正常
在这里插入图片描述

如有错误,欢迎指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值