一、some概念
普通jar包和springBoot的jar包有什么区别?
在springboot中打完jar包,jar包中包含工具类,自定义注解等,但是在其他项目中通过pom文件导入时,虽然能够导入成功,但是无法在代码中import相关的类。查阅相关资料得知,是打包插件的原因,springboot项目中自带的maven插件所打的jar不能引入,换成普通的maven插件即可
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 的实例了。
参考:
zhuanlan.zhihu.com/p/357053336 blog.csdn.net/weixin_5265… blog.csdn.net/u014161595/…