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());
    }

}

 

 

 

配置监控页功能

在配置类中添加如下信息

@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    可以访问到监控页面

 

 

之后写一个测试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();
    }

 

 

 

 

 

但是发现在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;
    }

 

 

 完整config代码

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信息可以正常显示

 

 

 

 

 

 

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

在监控页配置信息处添加

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方式进行配置

 

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

 

通过观察druid的autoconfigration发现,扩展配置项是:spring.datasource.druid

DruidDataSourceAutoConfigure   ->      DruidStatProperties

@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})

有自动配置类和DruidStatProperties配置类,

其中DruidDataSourceAutoConfigure  导入了四个类

@Import({DruidSpringAopConfiguration.class,     //用来监控spring组件也就是SpringBean   配置项:@ConditionalOnProperty({"spring.datasource.druid.aop-patterns"})

DruidStatViewServletConfiguration.class,   //与监控页有关的配置
@ConditionalOnProperty(name = {"spring.datasource.druid.stat-view-servlet.enabled"},havingValue = "true")

DruidWebStatFilterConfiguration.class,   //Web监控的配置 已经配置了filter
@ConditionalOnProperty(name = {"spring.datasource.druid.web-stat-filter.enabled"},havingValue = "true")

DruidFilterConfiguration.class})    //所有Druid自己的filter配置
绑定的配置项 

private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat"; private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config"; private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding"; private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j"; private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j"; private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2"; private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log"; private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall"; private static final String FILTER_WALL_CONFIG_PREFIX = "spring.datasource.druid.filter.wall.config";

在yaml文件中对上面4个类分别进行配置

对于配置文件的配如下:对于Druid的所有功能配置都可以在配置文件中进行配置,因为有设置注解配置,即配置文件进行了绑定@ConditionalOnProperty
spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

  resources:
    static-locations: [classpath:/templates,classpath:/static,classpath:/public]
  datasource:
    url: jdbc:mysql://localhost:3306/yschoolmall?characterEncoding=utf8&useSSL=true
    username: root
    password: 5892
    driver-class-name: com.mysql.jdbc.Driver
    druid:

   aop-patterns: com.sp.* #对springBean的监控 项目名com下的sp文件夹下的所有(监控springBean)
      filters: stat,wall,slf4j    #要开启的功能     stat:sql监控功能     wall : 防火墙监控功能    slf4j:进行记录
      filter:
        stat:             #对开启的功能进行详细配置
          slow-sql-millis: 1000    #1000毫秒的为慢查询..
          enabled: true           #开启功能
          log-slow-sql: true
        wall:
          enabled: true
          config:
            update-allow: true  #允许更新操作
            delete-allow: false  #不允许进行删表的操作

      stat-view-servlet:          #监控页功能
        enabled: true    #默认是false的这里一定要开启
        login-username: admin
        login-password: 123456
      web-stat-filter:   #用于监控web应用
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"

  jdbc:
    template:
      query-timeout: 5

server:
  servlet:
    context-path: /world
#      设置服务器访问路径
每一个功能都能找到对应的配置项

 

 

 

posted @ 2021-07-01 12:34  YuyuFishSmile  阅读(261)  评论(0)    收藏  举报