Spring Boot 学习(一) 整合Druid数据源

  • 自定义

1.引入依赖

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

2.写一个自己的配置类

分析:

  在springboot中自动配置源是根据判断是否含有数据源,再进行默认数据源的创建,导入了默认配置Hikari

  DataSourceAutoConfigration   里面进行判断是否含有数据源

  @ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")

  如果没有数据源则进行默认配置,导入了默认数据源  Hikari

  @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
  DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
  DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })

  点进去Hikari里面可以发现里面有@Bean  里面放了一个Hikari的数据源

  条件判断:

    @ConditionalOnMissingBean(DataSource.class)
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;
        }

    }

在自己建的config类中添加数据源组件,因为声明了为容器,所以在这里不会触发默认数据源配置,因为配置了数据源一定要配置数据库信息,所以这里一一配置的方式比较麻烦,可以通过注解@ConfigrationProperties("")来进行组件内容与配置文件的绑定

package com.sp.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 {
    @ConfigurationProperties("spring.datasource")
// 把组件里的内容与配置文件进行绑定,即spring下的datasource下的内容进行绑定
    @Bean
    public DataSource dataSource() {              //进行了DataSource设置为组件,此时容器中有了数据源
//@ConditionalOnMissingBean(DataSource.class) 在原来的Hikari中是没有才会配置,Hikari的数据源
//因为这里写了@Bean,所以Hikari的不会生效
        DruidDataSource druidDataSource = new DruidDataSource();
//        这里的信息可以通过注解来进行配置@ConfigurationProperties
//        druidDataSource.setUrl();
//        druidDataSource.setUsername();
//        druidDataSource.setPassword();
        return druidDataSource;                 //返回的数据源是druid
    }
}

测试

package com.sp;

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;

@Slf4j
@SpringBootTest
class BootWeb01ApplicationTests {

    @Autowired   //自动注入
    JdbcTemplate jdbcTemplate;

    @Autowired
    DataSource dataSource;
    @Test

    void contextLoads() {

        Long aLong = jdbcTemplate.queryForObject("select count(*) from whole",Long.class);
        System.out.println(aLong);
        log.info("记录总数:{}",aLong);

        log.info("数据源类型是{}",dataSource.getClass());
    }

}

Spring Boot 学习(一) 整合Druid数据源

 

 

 

配置监控页功能

在配置类中添加如下信息

@Bean
    public ServletRegistrationBean statViewServlet() {
        /*
            配置druid的监控页功能
         */
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<StatViewServlet>(statViewServlet,"/druid/*");//表示拦截的路径
        return registrationBean;
    }

之后进行测试

浏览器输入http://localhost:8080/world/druid/index.html    可以访问到监控页面

Spring Boot 学习(一) 整合Druid数据源

 

 

之后写一个测试Controller

 

 

   @Autowired    //因为容器中已经有了JdbcTemplate
    JdbcTemplate jdbcTemplate;
    @ResponseBody    //返回的数据在页面上进行显示
    @GetMapping("/sql")
    public String getSql() {
        Long aLong = jdbcTemplate.queryForObject("select count(*) from whole",Long.class);    //进行jdbctemplate事务的查询功能

        return aLong.toString();
    }

 

Spring Boot 学习(一) 整合Druid数据源Spring Boot 学习(一) 整合Druid数据源

 

 

 

 

但是发现在druid的监控页面上没有显示,原因在于:只开启了监控页功能,没有开启监控功能,所以接下来要配置监控统计功能

在MyDataSourceConfig类里面的datasource方法添加下面的方法即可

druidDataSource.setFilters("stat");

 

@ConfigurationProperties("spring.datasource")
// 把组件里的内容与配置文件进行绑定,即spring下的datasource下的内容进行绑定
    @Bean
    public DataSource dataSource() throws SQLException {
//@ConditionalOnMissingBean(DataSource.class) 在原来的Hikari中是没有才会配置,Hikari的数据源
//因为这里写了@Bean,所以Hikari的不会生效
        DruidDataSource druidDataSource = new DruidDataSource();
         /*
            配置监控统计功能
         */
        druidDataSource.setFilters("stat");     //多个值用逗号分隔即可,例如还想要开启防火墙    stat,wall  即可
//        这里的信息可以通过注解来进行配置@ConfigurationProperties
//        druidDataSource.setUrl();
//        druidDataSource.setUsername();
//        druidDataSource.setPassword();
        return druidDataSource;
    }

Spring Boot 学习(一) 整合Druid数据源

 

 

 完整config代码

Spring Boot 学习(一) 整合Druid数据源
package com.sp.config;


import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.sql.SQLException;

@Configuration
public class MyDataSourceConfig {
    @ConfigurationProperties("spring.datasource")
// 把组件里的内容与配置文件进行绑定,即spring下的datasource下的内容进行绑定
    @Bean
    public DataSource dataSource() throws SQLException {
//@ConditionalOnMissingBean(DataSource.class) 在原来的Hikari中是没有才会配置,Hikari的数据源
//因为这里写了@Bean,所以Hikari的不会生效
        DruidDataSource druidDataSource = new DruidDataSource();
         /*
            配置监控统计功能
         */
        druidDataSource.setFilters("stat");
//        这里的信息可以通过注解来进行配置@ConfigurationProperties
//        druidDataSource.setUrl();
//        druidDataSource.setUsername();
//        druidDataSource.setPassword();
        return druidDataSource;
    }

    @Bean
    public ServletRegistrationBean statViewServlet() {
        /*
            配置druid的监控页功能
         */
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<StatViewServlet>(statViewServlet,"/druid/*");
        return registrationBean;
    }
}
View Code

 

添加对应的web功能

根据官方文档https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter

有    init-param  的配置,以及value的配置

filter-name的配置

官方文档中关于web.xml的配置信息

<filter>
      <filter-name>DruidWebStatFilter</filter-name>
      <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
      <init-param>
          <param-name>exclusions</param-name>
          <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>DruidWebStatFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

 

springboot中config里面添加如下信息

//    WebStatFilter   用于采集Web-jdbc关联数据
  @Bean
    public FilterRegistrationBean webStatFilter() {
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));   //拦截所有路径
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); //排除静态资源
        return filterRegistrationBean;
    }

此时web信息可以正常显示

Spring Boot 学习(一) 整合Druid数据源

 

 Spring Boot 学习(一) 整合Druid数据源

 

 

 

 

 为监控界面添加保护机制,账号密码功能

在监控页配置信息处添加

registrationBean.addInitParameter("loginUsername","admin");
registrationBean.addInitParameter("loginPassword","123456");
@Bean
    public ServletRegistrationBean statViewServlet() {
        /*
            配置druid的监控页功能
         */
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<StatViewServlet>(statViewServlet,"/druid/*");
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","123456");
        return registrationBean;
    }

注意也可以在yaml中配置,因为是setXXXX这种在注解中已经进行了绑定

例如在配置stat和wall的时候可以在yaml中进行编写@ConfigurationProperties("spring.datasource") 此注解已经跟yaml进行了绑定

 

druidDataSource.setFilters("stat,wall");

spring:
  datasource:
    filters: stat,wall

 

  • starter方式进行配置

 

上一篇:基于springboot通过注解AOP动态切换druid多数据源--mybatis


下一篇:获取当前时间(年月日时分秒)