使用Spring Boot框架一段时间之后,相信你会发现在Spring Boot项目中经常会引入各种各样的Starter,例如Web项目的spring-boot-starter-web
以及集成MyBatis时的mybatis-spring-boot-starter
。那么这个Starter到底是些什么呢?
什么是Starter
其实Starter
主要是Spring Boot
用来简化项目依赖的一种形式,比如spring-boot-starter-web
中包含了一个Web项目通常所需要的依赖,这样我们就只需要依赖一个Starter
即可,无需一个个的添加所有的Web项目所需的Jar包,而且我们还可以通过Starter
来做一些自动配置。
结合之前数据源和Mybatis的内容,我就想能不能将之前连接MyBatis的过程封装成一个Starter
,这样以后其他项目集成MyBatis就会简单许多了。如果你想了解Spring Boot集成MyBatis相关的内容,可以查看之前的文章《Spring Boot中使用Mybatis》。在开始实现之前,我们还需要先了解一下Starter
的命名规范。
Starter的命名规范
1.Spring Boot自己提供的一些Starter的命名一般以spring-boot-starter-xxx
命名,例如spring-boot-starter-web
。
2.我们自己定义的Starter
通常情况下以xxx-spring-boot-starter
的形式命名。
自定义Starter
知道如何命名一个自定义Starter
之后,根据命名的建议新建了一个mybatis-config-spring-boot-starter
的项目。并且将之前集成MyBatis时候添加的依赖全部添加进来了。
添加完依赖之后,我们还需要一个配置类用来在项目启动时自动配置连接池以及扫描Mapper文件。所以我新建了一个MyBatisAutoConfiguration
类来做这些东西。
1 |
|
由于与之前集成MyBatis的配置大体一致,所以上面粘贴的代码有很多被省略的部分,您可以在源码中找到。其实也就是将之前集成MyBatis的配置Copy过来然后稍作修改,主要有以下几点修改:
- 定义了
MyBatisProperties
类,这个类主要是从配置文件中读取Mapper.xml的地址。配置会话工厂sqlSessionFactory
的时候设置的MapperLocation的路径就是从这里获取的。 - 去除了之前配置类上的
@MapperScan
注解,去掉的原因是我没有找到在注解中如何获取配置文件中的值,所以将它挪到了使用这个Starter
的项目的启动类上。
编写完上面的自动配置类后,我们需要做的是让Spring Boot知道在启动的时候需要执行这个配置类中的代码,实现的方式是在resources
文件夹下新建META-INF/spring.factories
文件,里面的内容如下所示。
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
好了,到这一步我们集成MyBatis的Starter
就已经完工了,接下来我们就来准备一个项目来测试一下吧。
Starter的使用
为了测试自己定义的Starter
,我们需要新建了一个项目starter-test
。然后将上面定义的Starter
添加到测试项目中。
1 | <dependency> |
添加了依赖之后,还需要编写了一些简单的测试代码,具体的测试代码在这里就不贴出来了,大家可以在源码中找到。但是第一次测试不幸的失败了,失败的原因是Mapper类都没有被初始化,原来是忘了在启动类上添加@MapperScan
注解,加上之后就可以完成测试了。
结束语
本文主要以Spring Boot集成MyBatis为例带大家一起了解了一下如何实现一个Spring Boot项目的Starter
。但是在实现过程中有一点点遗憾,就是没有找到在@MapperScan
里使用配置文件中配置的包路径的方法,如果您知道的话欢迎提交Pull Request
。本文的完整实现您可以在Github上找到,如果您喜欢这篇文章的话可以给个Star哦。
ps:“学习不止,码不停蹄”,如果你喜欢我的文章,就关注我吧。
