# 7.Spring Boot集成Druid

一、Druid 的介绍

阿里巴巴开源的数据库连接池

![](/files/-LfnTKKEwwUSFaPcjjhz)

中文文档：[点击查看](https://github.com/alibaba/druid/wiki/常见问题)

## 二、添加依赖

```markup
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.26</version>
</dependency>
```

## 三、配置

```
spring.datasource.url=jdbc:mysql://localhost/niuke_toutiao?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
```

所涉及文件

![](/files/-LfnTKKHFE_-l3ul9ObS)

## 四、添加 druid 的支持类

configuration/DruidConfiguration.java

```java
package com.shuju.test2.util.configuration;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DatabaseDriver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.alibaba.druid.pool.DruidDataSource;

@Configuration
public class DruidConfiguration {

    @ConditionalOnClass(DruidDataSource.class)
    @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.alibaba.druid.pool.DruidDataSource", matchIfMissing = true)
    static class Druid extends DruidConfiguration {
        @Bean
        @ConfigurationProperties("spring.datasource.druid")
        public DruidDataSource dataSource(DataSourceProperties properties) {
            DruidDataSource druidDataSource = (DruidDataSource) properties.initializeDataSourceBuilder().type(DruidDataSource.class).build();
            DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl());
            String validationQuery = databaseDriver.getValidationQuery();
            if (validationQuery != null) {
                druidDataSource.setValidationQuery(validationQuery);
            }
            return druidDataSource;
        }
    }
}
```

## 五、监控配置

1.配置 servlet

servlet/DruidStatViewServlet.java

```java
package com.shuju.test2.util.servlet;

import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

import com.alibaba.druid.support.http.StatViewServlet;

@WebServlet(urlPatterns = { "/druid/*" }, initParams = { @WebInitParam(name = "loginUsername", value = "demo"), @WebInitParam(name = "loginPassword", value = "demo") })
public class DruidStatViewServlet extends StatViewServlet {

    private static final long serialVersionUID = 1L;

}
```

2.配置 filter

filter/DruidWebStatFilter.java

```java
package com.shuju.test2.util.filter;

import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

import com.alibaba.druid.support.http.WebStatFilter;

@WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/*", initParams = { @WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*") })
public class DruidWebStatFilter extends WebStatFilter {

}
```

3.测试：<http://localhost:8080/druid/index.html>

4.sql 监控配置

application.properties加入以下配置

```
#filter类名:stat,config,encoding,logging
spring.datasource.druid.filters=stat,config
```

记得main函数上面加入注释配置

```
@ServletComponentScan
```

5.spring 监控配置

main函数上面加入注释配置

```
@ImportResource(locations = { "classpath:druid-bean.xml" })
```

resources/druid-bean.xml

这里配置的是方法监控，其他的可参考官方文档

```markup
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 配置_Druid和Spring关联监控配置 -->
    <bean id="druid-stat-interceptor"
          class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"></bean>

    <!-- 方法名正则匹配拦截配置 -->
    <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
          scope="prototype">
        <property name="patterns">
            <list>
                <value>com.shuju.test2.cache.*</value>
            </list>
        </property>
    </bean>

    <aop:config proxy-target-class="true">
        <aop:advisor advice-ref="druid-stat-interceptor"
                     pointcut-ref="druid-stat-pointcut" />
    </aop:config>

</beans>
```

加入aop依赖包

```markup
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
```

重启进入监控页面查看即可

![](/files/-LfnTKKLGo07NCRpklKE)

## 资料

[Druid](https://github.com/alibaba/druid/)

[阿里druid 介绍及配置](https://www.cnblogs.com/lmaplet/p/6170105.html)

[spring boot 学习(四)Druid连接池的使用配置](https://www.cnblogs.com/MaxElephant/p/8108304.html)

[springboot2.0整合druid，以及springboot自动装配DataSource原理](https://blog.csdn.net/qq_28410283/article/details/86700635)

[Spring Boot集成Druid实现数据源管理与监控](https://blog.csdn.net/garyond/article/details/80189939)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://spring-boot.shujuwajue.com/sheng-hua/7spring-bootji-cheng-druid.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
