数据访问之Druid启动器的使用

承接上文:SpringBoot数据访问之Druid数据源的自定义使用

官方文档:

Druid Spring Boot Starter

首先在在 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中的自动配置(两种方式):

  1. 可以双击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)
  1. 当容器中有这个类
  2. 后面的内容在这个类(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下之前的文章:

  1. 掘金: SpringBoot数据访问之自定义Druid
  2. 个人博客:SpringBoot数据访问之自定义Druid

通过该类上的属性配置进行属性绑定,@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可以使用。

参考:

havingValue

Druid Spring Boot Starter

SpringBoot2零基础入门springboot全套完整版

结束:

如果你看到这里或者正好对你有所帮助,希望能点个关注或者推荐,感谢;

有错误的地方,欢迎在评论指出,作者看到会进行修改。

SpringBoot数据访问之Druid启动器的使用的更多相关文章

  1. SpringBoot数据访问之Druid数据源的使用

    数据访问之Druid数据源的使用 说明:该数据源Druid,使用自定义方式实现,后面文章使用start启动器实现,学习思路为主. 为什么要使用数据源: ​ 数据源是提高数据库连接性能的常规手段,数据源 ...

  2. 06.深入浅出 Spring Boot - 数据访问之Druid

    代码下载:https://github.com/Jackson0714/study-spring-boot.git 一.Druid是什么? 1.Druid是数据库连接池,功能.性能.扩展性方面都算不错 ...

  3. SpringBoot数据访问之整合mybatis注解版

    SpringBoot数据访问之整合mybatis注解版 mybatis注解版: 贴心链接:Github 在网页下方,找到快速开始文档 上述链接方便读者查找. 通过快速开始文档,搭建环境: 创建数据库: ...

  4. Springboot数据访问,棒棒哒!

    Springboot对数据访问部分提供了非常强大的集成,支持mysql,oracle等传统数据库的同时,也支持Redis,MongoDB等非关系型数据库,极大的简化了DAO的代码,尤其是Spring ...

  5. springboot 数据访问【转】【补】

    六.SpringBoot与数据访问 1.JDBC pom.xml配置 <dependencies> <dependency> <groupId>org.spring ...

  6. SpringBoot数据访问(一) SpringBoot整合Mybatis

    前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...

  7. SpringBoot数据访问(二) SpringBoot整合JPA

    JPA简介 Spring Data JPA是Spring Data大家族的一部分,它可以轻松实现基于JPA的存储库.该模块用于增强支持基于JPA的数据访问层,它使我们可以更加容易地构建使用数据访问技术 ...

  8. Spring Boot数据访问之Druid连接池的配置

    在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...

  9. SpringBoot数据访问之整合Mybatis配置文件

    环境搭建以及前置知识回顾 SpringBoot中有两种start的形式: 官方:spring-boot-starter-* 第三方:*-spring-boot-starter Mybatis属于第三方 ...

随机推荐

  1. es6快速入门 系列 - async

    其他章节请看: es6 快速入门 系列 async 前文我们已经知道 promise 是一种异步编程的选择.而 async 是一种用于执行异步任务更简单的语法. Tip:建议学完 Promise 在看 ...

  2. Linux-远程服务ssh

    1.远程管理服务介绍 (1)SSH是(Secure Shell Protocol)的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行机密处理,加密后在进行文件 ...

  3. 【问答分享第一弹】MySQL锁总结:MySQL行锁、表锁、排他锁、共享锁的特点

    大家好,我是小于哥哈.前几天能分享了第一期面试题,MySQL 中有哪几种锁 和 这些锁各有哪些特点 ,这道面试题是经常会被问到的一个面试题,大家反馈的都挺不错的.今天特此来总结一下. 首发于公众号[终 ...

  4. redis-list实现

    Redis 数据结构---链表 Redis的list底层实现使用的不是数组而是链表的数据结构 叫listnode  是一个双向链表 ListNode{ Struct listNode *prev  / ...

  5. 排序---python版

    冒泡排序: 比较相邻的元素.如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数: 针对所有的元素重复以上的步骤,除了最 ...

  6. css--filter(滤镜) 属性

    前言 前段时间找工作面试官问到一个问题,你如何将一个网页整体置灰?面试遇到这样的问题,一下束手无策,之前没有接触过这样的需求,因此没有回答上来,面试结束我才知道了这是考查对 CSS3 的新属性的了解. ...

  7. 交换机卡在CPU task进程处理方法

    故障现象: 笔记本通过console线连接H3C交换机的console口,无法登陆,敲任何东西都无效.因为没有备份,不敢重启.显示以下报错: <test-sw> wrong input! ...

  8. Django基础-03篇 操作Django自带的admin后台

    1.使用model.py来定义表结构,使用命令同步到数据库 python manage.py makemigrations #生成表结构(py) python manage.py makemigrat ...

  9. Python使用笔记27--mysql操作封装类

    1.面向过程 1 import pymysql 2 3 #面向过程 4 mysql_info = {'host':'127.0.0.1', 5 'port':3306, 6 'user':'root' ...

  10. HTTP 2.0标准针对HTTP 1.X的五点改进

    HTTP 2.0兼容HTTP 1.X,同时大大提升了Web性能,进一步减少了网络延迟,减少了前端方面的工作.HTTP 1.X存在的缺点如下: 1)HTTP 1.0一次只允许在一个TCP连接上发起一个请 ...