自定义一个Starter : MyBatis拦截器改写sql语句

628 阅读2分钟

一、some概念

普通jar包和springBoot的jar包有什么区别?

在springboot中打完jar包,jar包中包含工具类,自定义注解等,但是在其他项目中通过pom文件导入时,虽然能够导入成功,但是无法在代码中import相关的类。查阅相关资料得知,是打包插件的原因,springboot项目中自带的maven插件所打的jar不能引入,换成普通的maven插件即可

blog.csdn.net/u013305783/…

jar包和自定义starter有什么区别?

1、普通的 jar 包为了好的扩展性,都会设计的功能单一,配置丰富,易于移植。但是 starter 最重要的是易用性,所以 starter 一般不会是单个功能的 jar,而是一组 jar 的集合。还是以 mybatis 举例, 它 的 starter 内部依赖了 mybatis,mybatis-spring,spring-boot-starter-jdbc,spring-boot-autoconfigure 等等 jar 包。

2、starter,都是用于集成 Spring Boot ,强依赖于 Spring Boot。不过并不是不用 Spring Boot 就不能引用 starter,还是可以当做普通 jar 包一样使用,只是会丧失最重要的自动配置的能力,总之,starter 可以和普通 jar 包一样使用,但最适用于 Spring Boot 环境。

3、starter 通过 spring.factories 实现自动配置

zhuanlan.zhihu.com/p/357053336

二、实例分析

以下是自己在做项目的过程中封装starter过程 需求是需要拦截其他项目执行的sql,改写sql,得到其sql的执行计划,

1、构建项目、命名、导入依赖

构建一个普通的SpringBoot项目

名称
SpringBoot 官方提供的 starter 以 spring-boot-starter-xxx 的方式命名的。 自定义的建议使用 xxx-spring-boot-starter 命名。

导入依赖

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
  </dependency>
</dependencies>

注意不要使用SpringBoot的打包插件!!!(坑)。替换成下面的maven自己的插件

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
        </plugin>
    </plugins>
</build>

2、编写MySQL拦截器

这里的拦截器我主要是拦截了SQL模板和具体的SQL以及计算SQL运行的时间
(得到具体的SQL之后可以利用JdbcTemplate来执行"explain + sql"获得执行计划)


@Intercepts({
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class MybatisInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
          ........代码我就不放上来了.......
    }
}

3、配置拦截器

创建一个config包,将下面这个类放入这个包中

@Configuration
@ComponentScan(basePackages = "indi.wgx")
@ConditionalOnProperty(name = "explain-interception", havingValue = "true")
public class MybatisConfiguration {
    @Bean
    public MybatisInterceptor mybatisInterceptor() {
        return new MybatisInterceptor();
    }
}

@ConditionalOnProperty(name = "explain.interception", havingValue = "true") :@ConditionalOnProperty 注解表示如果项目配置了 explain-interception 为 true,那么这个配置类会生效。这个配置类创建一个类型为 MybatisInterceptor 的 Bean。

4、spring.factories

在该项目的 META-INF 目录下创建 spring.factories 文件,并增加 EnableAutoConfiguration 的实现类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
indi.wgx.config.MybatisConfiguration

5、打包

install 后,就可以在本地仓库找到jar包并引用了。

在引用这个starter的项目中的application.properties 中配置 explain.interception 为 true, 我们就可以注入 MybatisInterceptore 的实例了。

image.png

参考:

zhuanlan.zhihu.com/p/357053336 blog.csdn.net/weixin_5265… blog.csdn.net/u014161595/…