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. ...
随机推荐
- opencv——几何变换原理与实现
摘要 图像几何变换又称为图像空间变换, 它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置.几何变换不改变图像的像素值, 只是在图像平面上进行像素的重新安排. 几何变换大致分为仿射变换.投影变换. ...
- C#中的partial关键字
这节讲一下partial(局部的,部分的)关键字,初学者可能没有接触过这个关键字,但是只要你写过winform或者WPF应用程序的话,那你肯定被动用过这个关键字.首先介绍一下这个关键字的作用,它用作定 ...
- Educational Codeforces Round 92 (Rated for Div. 2)
A.LCM Problem 题意:最小公倍数LCM(x,y),处于[l,r]之间,并且x,y也处于[l,r]之间,给出l,r找出x,y; 思路:里面最小的最小公倍数就是基于l左端点的,而那个最小公倍数 ...
- 解决Latex输出PDF纸张自适应大小及中文无法显示问题
遗留的问题 之前我们进行了基于texlive定制chemfig化学式转换Python服务镜像,虽然完成pdf的输出服务改造,但是输出效果并不是太好,如下图: 这个图有两个比较严重问题 不支持中文 空白 ...
- 北航OO(2020)第二单元博客作业
第二单元第一次作业 多线程设计策略 第一次作业的想法是设计三个线程:输入线程,调度器线程以及电梯线程.输入线程获取请求并发送给调度器线程:调度器线程通过查询电梯线程的状态(等待.停靠以及移动),并综合 ...
- XAML常用控件2
这节继续讲一些xaml中的常用控件. 布局控件 除了我们之前讲过的Grid,StackPanel,Border布局控件,xaml中还有如下几个布局控件: Canvas:使用这个布局,可以通过坐标来控制 ...
- Mac 将 App 程序打包成为 dmg
用最简单的打包方式,将自己开发的App打包成为DMG,实现共享分发,快速安装 1. 新建DMG 打开磁盘工具,新建DMG File->New Image->Blank Image 创建DM ...
- Linux_配置本地YUM源(RHEL8)
[RHEL8] Linux-RHEL8配置本地YUM 源,按照之前传统的配置本地YUM的方法肯定不行,在RHEL8版本的软件源发生了变化,在RHEL8版本的软件仓库分成了两部分:[AppStream] ...
- 使用 parted 命令可以查看系统采用什么类型的分区表 gpt/mbr/msdos/ext/ext/ext2/ext3/ext4
Linux磁盘表示方式 Linux以字母标识磁盘的个数 a:第一块 b:第二块 Linux用数字标识分区:1-4标识主分区或扩展分区 逻辑分区从5开始 例如:sda.sda1.sda2 低级格式化 ...
- 025.Python面向对象以及对对象的操作
一 面向对象基本概念 1.1 OOP面向对象的程序开发 用几大特征表达一类事物称为一个类,类更像是一张图纸,表达只是一个抽象概念 对象是类的具体实现,更像是由这图纸产出的具体物品,类只有一个,但是对象 ...