SpringBoot数据访问之Druid启动器的使用
数据访问之Druid启动器的使用
官方文档:
首先在在 Spring Boot 项目中加入
druid-spring-boot-starter依赖 。
博主版本:1.1.17 SpriongBoot:2.5.3
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>版本号</version>
</dependency>
我们来看下Druid中的自动配置(两种方式):
- 可以双击shift打开搜索找到DruidDataSourceAutoConfigure

源码分析:
为什么导入启动器就能使用Druid数据源。
@Configuration
@ConditionalOnClass(DruidDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class,
DruidStatViewServletConfiguration.class,
DruidWebStatFilterConfiguration.class,
DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);
@Bean(initMethod = "init")
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
return new DruidDataSourceWrapper();
}
}
看以下两个注解:
@ConditionalOnClass(DruidDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
- 当容器中有这个类
- 后面的内容在这个类(DataSourceAutoConfiguration.class)之前执行
为什么这样设置呢?
进入DataSourceAutoConfiguration类后找到引入的DataSourceConfiguration.Hikari.class,。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
matchIfMissing = true)
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;
}
}
由上述代码可以发现,默认的配置源是HikariDataSource,但是有一个要求:
@ConditionalOnMissingBean(DataSource.class)
就是如果在容器中没有数据源,下面代码生效,也就是使用HikariDataSource,但是若容器中已经有开发者创建的数据源,那么开发者创建的优先。
所以Druid的创建必须要在默认源之前声明,如果在默认源之后声明,Druid数据源将不生效,由于Druid的自动配置决定的:
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
return new DruidDataSourceWrapper();
}
ConditionalOnMissingBean:容器中已经有了默认源的话,那么Druid的源是不生效的。
功能实现介绍:
查看具体的功能只要分析它导入了哪些类就能明白它所实现的功能。
- DruidSpringAopConfiguration.class,
- DruidStatViewServletConfiguration.class,
- DruidWebStatFilterConfiguration.class,
- DruidFilterConfiguration.class
DruidSpringAopConfiguration对应功能

该类是配置Spring的监控的,点击进入,可以看到相关的设置:
@Bean
@ConditionalOnProperty(name = "spring.aop.auto",havingValue = "false")
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
与我们手动配置的如出一辙,不明白的朋友可以简单了解z下之前的文章:
通过该类上的属性配置进行属性绑定,@ConditionalOnProperty("spring.datasource.druid.aop-patterns")
配置项:spring.datasource.druid.aop-patterns
所以我们可以在application.yaml文件中配置Springd监控的功能。
DruidStatViewServletConfiguration
该类是实现开启监控页的功能,相当于我们之前写的StatViewServlet
自定义写法:
/**
* 配置监控页
*/
@Bean
public ServletRegistrationBean staViewServlet(){
//实例化StatViewServlet
StatViewServlet statViewServlet = new StatViewServlet();
//将实例化的实例化StatViewServlet 传入ServletRegistrationBean,并设置访问路径
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
return registrationBean;
}
Druid-start中的配置:

基本上也是如出一辙,自定义的功能比较单一。
所以我们使用Druid-start来简化我们之前的操作,可以通过DruidStatViewServletConfiguration中的配置属性配置:
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true")
配置项:spring.datasource.druid.stat-view-servlet.enabled。
扩展(havingValue):
@ConditionalOnProperty,这个注解能够控制某个configuration是否生效。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效
通过上述文章的所说,SpringBoot首先会去spring.datasource.druid.stat-view-servlet该配置项中找到enabled的值是什么,如果该值与havingValue指定的值进行比较,一样则返回true,这样该Bean就会生效,也就是该组件或者功能开启。在配置文件中我们设置后可以佐证该结论是否正确。
后面两个类也基本是相同的方法,各位自行查看,在此省略。
DruidWebStatFilterConfiguration //web应用开启DruidFilterConfiguration //Filter开启
开启配置属性:
配置必须属性:
spring: datasource: url: jdbc:mysql://localhost:3306/vuesite username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver
开启监控页:
开启监控页也就是增加StatViewServlet组件。
spring: datasource: url: jdbc:mysql://localhost:3306/vuesite username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver druid: stat-view-servlet: enabled: true
我们看一下enabled的默认配置,点击enabled,找到私有属性可知:
/** * Enable StatViewServlet, default false. */private boolean enabled;
默认为false,这也就佐证了上述的结论。
完整的yaml基本配置如下:
spring: datasource: url: jdbc:mysql://localhost:3306/vuesite username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver druid: aop-patterns: com.xbhog.* filters: stat,wall # 底层开启功能,stat(sql监控),wall(防火墙) stat-view-servlet: # 配置监控页功能 enabled: true login-username: admin login-password: admin resetEnable: false web-stat-filter: # 监控web enabled: true urlPattern: /* exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' filter: stat: #对上面filters里面的stat的详细配置 slow-sql-millis: 1000 logSlowSql: true enabled: true wall: enabled: true config: drop-table-allow: false
因为我们监控主要事情是sql,所以测试功能的时候需要发送一个controller sql.如下代码:
@Controllerpublic class Mycontro { @Autowired JdbcTemplate jdbcTemplate; @ResponseBody //不经过视图解析器 @GetMapping("/sql") public String druidquery(){ Long aLong = jdbcTemplate.queryForObject("select count(*) from user",Long.class); return aLong.toString(); }}
在配置的时候出现的错误
aop-patterns配置好以后,打开界面刷新,发现并没有生效,也就是没有监控到。
在网上找了很多方法,也看了官方文档,还是不行。
最后使用了原始的方法,降版本号,亲测在 Druid在1.1.17可以使用。

参考:
SpringBoot2零基础入门springboot全套完整版
结束:
如果你看到这里或者正好对你有所帮助,希望能点个关注或者推荐,感谢;
有错误的地方,欢迎在评论指出,作者看到会进行修改。
SpringBoot数据访问之Druid启动器的使用的更多相关文章
- SpringBoot数据访问之Druid数据源的使用
数据访问之Druid数据源的使用 说明:该数据源Druid,使用自定义方式实现,后面文章使用start启动器实现,学习思路为主. 为什么要使用数据源: 数据源是提高数据库连接性能的常规手段,数据源 ...
- 06.深入浅出 Spring Boot - 数据访问之Druid
代码下载:https://github.com/Jackson0714/study-spring-boot.git 一.Druid是什么? 1.Druid是数据库连接池,功能.性能.扩展性方面都算不错 ...
- SpringBoot数据访问之整合mybatis注解版
SpringBoot数据访问之整合mybatis注解版 mybatis注解版: 贴心链接:Github 在网页下方,找到快速开始文档 上述链接方便读者查找. 通过快速开始文档,搭建环境: 创建数据库: ...
- Springboot数据访问,棒棒哒!
Springboot对数据访问部分提供了非常强大的集成,支持mysql,oracle等传统数据库的同时,也支持Redis,MongoDB等非关系型数据库,极大的简化了DAO的代码,尤其是Spring ...
- springboot 数据访问【转】【补】
六.SpringBoot与数据访问 1.JDBC pom.xml配置 <dependencies> <dependency> <groupId>org.spring ...
- SpringBoot数据访问(一) SpringBoot整合Mybatis
前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...
- SpringBoot数据访问(二) SpringBoot整合JPA
JPA简介 Spring Data JPA是Spring Data大家族的一部分,它可以轻松实现基于JPA的存储库.该模块用于增强支持基于JPA的数据访问层,它使我们可以更加容易地构建使用数据访问技术 ...
- Spring Boot数据访问之Druid连接池的配置
在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...
- SpringBoot数据访问之整合Mybatis配置文件
环境搭建以及前置知识回顾 SpringBoot中有两种start的形式: 官方:spring-boot-starter-* 第三方:*-spring-boot-starter Mybatis属于第三方 ...
随机推荐
- 获取微信公众号的粉丝openid以及用openid获取unionID
第一步获取微信粉丝的openid https://api.weixin.qq.com/cgi-bin/user/get?access_token=access_token access_token这里 ...
- c#json将字符串反序列化成对象时不新建类的做法
在服务端代码文件中加上struct结构体就能解决 struct LocationInfo { public string LocationID { get; set; } public string ...
- 基于 CentOS 8 搭建 openLDAP 服务器
转载请注明原文地址:基于 CentOS 8 搭建 openLDAP 服务器 环境 OS: CentOS 8.4.2105 PHP: 7.4.21 注意 CentOS 7 中可能默认提供了 openLD ...
- 详解C++中继承的基本内容
有些类与类之间存在特殊的关系,有共性也有特性,比如动物类可以细分为猫,狗等.下级别的成员除了拥有上一级的共性,还有自己的特性,这个时候就可以考虑继承的技术,减少重复代码. 一.继承中的对象模型 1.1 ...
- 八皇后O(1)算法题解
题目描述 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上.问共有多少种不同的方法,并且按字典序从小到大指出各种不同的放法. 题解 见证奇迹的时 ...
- Linux云计算-02_CentOS Linux 7.X系统管理
Linux系统安装完毕,需要对Linux系统进行管理和维护,让Linux服务器能真正应用于企业中. 本章介绍Linux系统32位与64位区别.内核命名规则.引导原理.启动流程.TCP/IP协议概述.I ...
- ssh-正向与反向代理
常用参数 栗子 实战 常用参数 -N 告诉SSH客户端,这个连接不需要执行任何命令.仅仅做端口转发 -C 表示压缩数据传输 -f 告诉SSH客户端在后台运行 -q Quiet mode. 安静模式,忽 ...
- [源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构
[源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构 目录 [源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构 0x00 摘要 ...
- Innodb中有哪些锁?
0.前言 上一篇从MySQL层面上了解锁,那么这篇我们从存储引擎上来了解, 以MySQL默认存储引擎Innodb来说,看看有哪些锁?(MySQL版本为8) 1.Shared and Exclusive ...
- 我是如何用redis做实时订阅推送的(转)
前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了... 其中 ...