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

先看一下项目结构:

pom.xml文件的内容如下:

主要依赖了Springboot中自动配置的一些依赖,具体请参考:

https://docs.spring.io/spring-boot/docs/2.4.1/reference/html/appendix-configuration-metadata.html#configuration-metadata-format

<?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及其执行时间的更多相关文章

  1. SpringBoot --- 自定义 Starter

    SpringBoot --- 自定义 Starter 创建 1.需要创建一个新的空工程 2.新的工程需要引入两个模块 一个Maven 模块 作为启动器 一个SpringBoot 模块 作为自动配置模块 ...

  2. SpringBoot中Mybatis打印sql日志

    application.yml中加上 # springBoot+Mybatis 控制台打印SQL语句 (方式一) logging: level: com.zoctan.api.mapper : deb ...

  3. MyBatis 插件 : 打印 SQL 及其执行时间

    Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用: Executor(update. ...

  4. SpringBoot自定义starter及自动配置

    SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目.除了官方已有的starter,用户自己也可以根据规则自定义自己的starter项目. 自定义starter条件 自动 ...

  5. SpringBoot自定义Starter实现

    自定义Starter: Starter会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦.Starter 提供了一种开箱即用的理念,其中核心就是springboot的自动配置原理相 ...

  6. 【记录】spring/springboot 配置mybatis打印sql

    ======================springboot mybatis 打印sql========================================== 方式 一: ##### ...

  7. springboot 自定义starter之AutoConfiguration【原】

    八.自定义starter AutoConfiguration: 1.这个场景需要使用到的依赖是什么? 没有特别依赖的配置 2.如何编写自动配置 @Configuration //指定这个类是一个配置类 ...

  8. SpringBoot自定义starter开发分布式任务调度实践

    概述 需求 在前面的博客<Java定时器演进过程和生产级分布式任务调度ElasticJob代码实战>中,我们已经熟悉ElasticJob分布式任务的应用,其核心实现为elasticjob- ...

  9. (后端)SpringBoot中Mybatis打印sql(转)

    原文地址:https://www.cnblogs.com/expiator/p/8664977.html 如果使用的是application.properties文件,加入如下配置: logging. ...

随机推荐

  1. ppt技巧一四步法调整PPT

    声明:本文所有截图来源于网易云课堂--<和秋叶一起学PPT>,仅作为个人复习之用,特此声明! 常见配色方案 可以从模板或公司logo取色 图片的选择要高清.风格.主题一致

  2. Jenkins 基础篇 - 任务分类

    从前面的小节中我们看到在创建 Jenkins 任务的时候有好几种类型,如果你专门安装了 Maven 相关插件,可能还会有一个[构建一个 maven 项目]的任务类型,那这些任务类型究竟有何区别,以及我 ...

  3. pip安装模块或者更新出现问题Error:Could not install packages due to an EnvironmentError

    问题分析 出现此问题大致的原因: 就是包安装的位置没有读写的权限,这个多半是因为安装python的时候安装在了C盘,或者其他programs这类的文件夹里 或者就是环境变量的设置的安装位置的问题,导致 ...

  4. java中基本数据类型、包装类及字符串之间的相互转换

    基本数据类型:不支持面向对象的编程机制(没有属性和方法),即不支持面向对象,之所以提供8中基本数据类型,是为了方便常规数据的处理. 包装类:通过包装类可以将基本数据类型的值包装为引用数据类型的对象,使 ...

  5. 安装SpecCPU2006 on Linux of CentOS6.3, gcc4.4.7

    安装SpecCPU2006 on Linux of CentOS6.3, gcc4.4.7 由于在tools/bin目录中只有ia64-linux,所以在直接运行./install.sh脚本时,系统会 ...

  6. linux服务之NTP及chrony时间同步

    博客园 首页 联系 管理   linux服务之NTP及chrony时间同步   一.NTP时间同步 NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步 ...

  7. cut命令用于按“列”提取文本字符,格式为“cut [参数] 文本”

    8.cut命令 cut命令用于按"列"提取文本字符,格式为"cut [参数] 文本". 在Linux系统中,如何准确地提取出最想要的数据,这也是我们应该重点学习 ...

  8. http keep-alive 的一些理解

    在日常的工作中涉及到了关于检测用户是否在线的功能需求,在方案设计过程中考虑过使用http-keepalive的方式,由于我们获取到的keepalive是经过nginx转发的keep-alive,所以最 ...

  9. 统信UOS - 扩展系统盘

    一.开root权限,开终端 二.执行lsblk指令,查看磁盘情况 可以发现 / 路径 对应的是loop0,查阅可知loop设备就是一个文件,挂载为一个路径操作的,这就尴尬了,好好的分区不用,你干嘛这么 ...

  10. Ubuntu16.04下使用ufw保护docker容器

      ufw屏蔽服务器非docker容器应用端口没有任何问题.问题出在屏蔽不了容器应用对应端口.排除了"ufw使用不当"."docker-compose.yml端口映射不正 ...