Springboot自定义starter打印sql及其执行时间
前面写到了通过实现mybatis提供的org.apache.ibatis.plugin.Interceptor接口实现了打印SQL执行时间,并格式化SQL及其参数,如果我们使用的是ssm还得再配置文件中添加一小段配置,如果使用的是Springboot,也得把bean注入到spring的IOC容器中。哎,谁让我们是一个懒人呢?既然是一个懒人,就把懒人做到极致,嘻嘻嘻,今天我们就通过自定义Springboot starter的方式使用该插件,我们使用的时候只需要把对应的依赖添加到我们项目的pom.xml中,其他的就什么也不用做了。
先看一下项目结构:

pom.xml文件的内容如下:
主要依赖了Springboot中自动配置的一些依赖,具体请参考:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.liekkas</groupId>
<artifactId>sql-cost-spring-boot-starter</artifactId>
<version>1.0.0</version>
<name>sql-cost-print</name>
<description>打印SQL执行时间和SQL语句</description> <properties>
<java.version>11</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies> <build>
<finalName>
sql-cost-spring-boot-starter
</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--跳过单元测试的包-->
<skip>
true
</skip>
</configuration>
</plugin>
</plugins>
</build> </project>
自定义打印SQL执行时间starter的过程如下:
第一步:定义配置类,用来接收application.yml中的参数
import org.springframework.boot.context.properties.ConfigurationProperties; /**
* description
*
* @author liekkas 2021/01/09 17:12
*/
@ConfigurationProperties(prefix = "sql-cost-print")
public class SqlPluginProperties { private boolean enable; public boolean isEnable() {
return enable;
} public void setEnable(boolean enable) {
this.enable = enable;
}
}
@ConfigurationProperties的作用是将配置文件转换成类对象,获取application.yml配置的值
其中prefix = "sql-cost-print"的作用是在application.yml配置的增加一个前缀。
第二步:自动装配打印SQL的Bean
import com.liekkas.sqlcost.plugin.SqlCostPlugins;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* description
*
* @author liekkas 2021/01/09 16:32
*/
@Configuration
@EnableConfigurationProperties(SqlPluginProperties.class)
@ConditionalOnProperty(prefix = "sql-cost-print", name = "enable",
havingValue = "true", matchIfMissing = true)
public class AutoConfigSqlCostPlugin {
@Bean
@ConditionalOnClass(value = StatementHandler.class)
public SqlCostPlugins sqlCostPlugins() {
return new SqlCostPlugins();
}
}
@Configuration注解的作用是标记该类是一个配置类
@EnableConfigurationProperties的作用是开启@ConfigurationProperties,使SqlPluginProperties中的属性生效
@ConditionalOnProperty来控制自动配置是否生效,havingValue = "true"代表当sql-cost-print.enable=true的时候自动配置才会生效,matchIfMissing = true代表配置文件中没有配置时也会生效。
@ConditionalOnClass(value = StatementHandler.class)的作用是只有再类路径中有StatementHandler.class的时候才会将SqlCostPlugins注入到IOC容器中。
综上,按照本starter的自动配置方式,只有当application.yml中的sql-cost-print.enable=true或者不配置时打印SQL,其他都不会打印SQL。
第三步:在spring.factories中添加配置
完整的路径为src/main/resources/META-INF/spring.factories
添加的内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.liekkas.sqlcost.configuration.AutoConfigSqlCostPlugin
最后使用mvn clean install 打成jar包放入自己本地的maven仓库,使用的时候只需在自己的项目中添加下面的依赖即可,仅限Springboot的项目使用哦!
<dependency>
<groupId>com.liekkas</groupId>
<artifactId>sql-cost-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
当不想启用打印SQL的时候只需要在application.yml中添加以下配置即可。
sql-cost-print:
enable: false
上边代码中的SqlCostPlugins类的具体内容请参考我的另一篇博客:
https://www.cnblogs.com/wkynf/p/14102201.html
Springboot自定义starter打印sql及其执行时间的更多相关文章
- SpringBoot --- 自定义 Starter
SpringBoot --- 自定义 Starter 创建 1.需要创建一个新的空工程 2.新的工程需要引入两个模块 一个Maven 模块 作为启动器 一个SpringBoot 模块 作为自动配置模块 ...
- SpringBoot中Mybatis打印sql日志
application.yml中加上 # springBoot+Mybatis 控制台打印SQL语句 (方式一) logging: level: com.zoctan.api.mapper : deb ...
- MyBatis 插件 : 打印 SQL 及其执行时间
Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用: Executor(update. ...
- SpringBoot自定义starter及自动配置
SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目.除了官方已有的starter,用户自己也可以根据规则自定义自己的starter项目. 自定义starter条件 自动 ...
- SpringBoot自定义Starter实现
自定义Starter: Starter会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦.Starter 提供了一种开箱即用的理念,其中核心就是springboot的自动配置原理相 ...
- 【记录】spring/springboot 配置mybatis打印sql
======================springboot mybatis 打印sql========================================== 方式 一: ##### ...
- springboot 自定义starter之AutoConfiguration【原】
八.自定义starter AutoConfiguration: 1.这个场景需要使用到的依赖是什么? 没有特别依赖的配置 2.如何编写自动配置 @Configuration //指定这个类是一个配置类 ...
- SpringBoot自定义starter开发分布式任务调度实践
概述 需求 在前面的博客<Java定时器演进过程和生产级分布式任务调度ElasticJob代码实战>中,我们已经熟悉ElasticJob分布式任务的应用,其核心实现为elasticjob- ...
- (后端)SpringBoot中Mybatis打印sql(转)
原文地址:https://www.cnblogs.com/expiator/p/8664977.html 如果使用的是application.properties文件,加入如下配置: logging. ...
随机推荐
- Salsa20算法介绍
简介 Salsa20是一种流式对称加密算法,类似于Chacha20,算法性能相比AES能够快3倍以上. Salsa20算法通过将32 Byte的key和8 Byte的随机数nonce扩展为2^70 B ...
- 关于MDI多文档程序的一些思考
MDI程序的框架 客户窗口是一个预定义的窗口类(MDICLIENT),它是框架窗口的子窗口同时也是各个子文档窗口的父窗口.框架窗口和各个子文档窗口都是自定义的窗口类. MDI程序中的一些要点 窗口中的 ...
- VS·卸载进程卡死"正在配置您的系统,这可能需要一些时间"
阅文时长 | 0.34分钟 字数统计 | 596.8字符 主要内容 | 1.引言&背景 2.声明与参考资料 『VS·卸载进程卡死"正在配置您的系统,这可能需要一些时间"』 ...
- AOP随笔
AOP: Aspect-Oriented Programming 面向切面编程. 首先明确一个点:AOP是一个概念.那么对于一个概念,其实现方式多种多样,分为静态AOP.动态AOP,而对于动态AOP的 ...
- 攻防世界(五)Web_php_include
攻防世界系列:Web_php_include 方法一:大小写绕过 strstr()函数对php我协议进行了过滤,但我们可以尝试大小写绕过 抓包POST传值让其执行我们输入的命令 ?page=Php:/ ...
- k8s运行容器之Job应用(6)
容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...
- 060.Python组件-中间件
一 中间件基本介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会 ...
- python基础之字符串类型
一.python字符串类型概述 定义:在单引号\双引号\三引号内,由一串字符组成 name='Test' name = 'test' print(type(name)) --------------- ...
- 9.13-15 runlevel & init & service
runlevel:输出当前运行级别 runlevel命令用于输出当前Linux系统的运行级别. -quiet 不输出结果,用于通过返回值判断的场合 [root@cs6 ~]# runlevel N 3 ...
- 启动dubbo消费端过程提示No provider available for the service的问题定位与解决
文/朱季谦 某次在启动dubbo消费端时,发现无法从zookeeper注册中心获取到所依赖的消费者API,启动日志一直出现这样的异常提示 Failed to check the status of t ...