想要获取更多文章可以访问我的博客 - 代码无止境

使用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的过程封装成一个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类来做这些东西。

@Configuration
@EnableConfigurationProperties({MyBatisProperties.class, DruidDataSourceProperties.class})
public class MyBatisAutoConfiguration { @Autowired
private MyBatisProperties myBatisProperties; @Autowired
private DruidDataSourceProperties druidDataSourceProperties; ...此处省略若干代码。 @Bean(name = "sqlSessionFactory")
@ConditionalOnMissingBean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("druidDataSource") DruidDataSource druidDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(druidDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(myBatisProperties.getMapperXmlLocation()));
return sessionFactory.getObject();
} }

由于与之前集成MyBatis的配置大体一致,所以上面粘贴的代码有很多被省略的部分,您可以在源码中找到。其实也就是将之前集成MyBatis的配置Copy过来然后稍作修改,主要有以下几点修改:

  1. 定义了MyBatisProperties类,这个类主要是从配置文件中读取Mapper.xml的地址。配置会话工厂sqlSessionFactory的时候设置的MapperLocation的路径就是从这里获取的。
  2. 去除了之前配置类上的@MapperScan注解,去掉的原因是我没有找到在注解中如何获取配置文件中的值,所以将它挪到了使用这个Starter的项目的启动类上。

编写完上面的自动配置类后,我们需要做的是让Spring Boot知道在启动的时候需要执行这个配置类中的代码,实现的方式是在resources文件夹下新建META-INF/spring.factories文件,里面的内容如下所示。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.itweknow.mybatisconfigspringbootstarter.config.MyBatisAutoConfiguration

好了,到这一步我们集成MyBatis的Starter就已经完工了,接下来我们就来准备一个项目来测试一下吧。

Starter的使用

小代同学为了测试自己定义的Starter,特地新建了一个项目starter-test。然后小代同学充满信心地将上面定义的Starter添加到了测试项目中。

<dependency>
<groupId>cn.itweknow</groupId>
<artifactId>mybatis-config-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

添加了依赖之后,小代同学编写了一些简单的测试代码,具体的测试代码在这里就不贴出来了,大家可以在源码中找到。但是第一次测试不幸的失败了,失败的原因是Mapper类都没有被初始化,原来是忘了在启动类上添加@MapperScan注解,加上之后就可以完成测试了。

结束语

本文主要以Spring Boot集成MyBatis为例带大家一起了解了一下如何实现一个Spring Boot项目的Starter。但是在实现过程中有一点点遗憾,就是没有找到在@MapperScan里使用配置文件中配置的包路径的方法,如果您知道的话欢迎提交Pull Request。本文的完整实现您可以在Github上找到,如果您喜欢这篇文章的话可以给个Star哦。

PS:学习不止,码不停蹄!如果您喜欢我的文章,就关注我吧!

小代学Spring Boot之自定义Starter的更多相关文章

  1. 小代学Spring Boot之数据源

    想要获取更多文章可以访问我的博客 - 代码无止境. 经过一天对Spring Boot的研究,小代同学已经对Spring Boot框架有了一个大概的认识.并且还创建了一个简单的Spring Boot的W ...

  2. 小代学Spring Boot之集成MyBatis

    想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...

  3. 小代学Spring Boot之开篇

    想要获取更多文章可以访问我的博客 - 代码无止境. 前情提要 小代是一名入职不久的程序员,公司同事都亲切的称他小代.有一天小代的老大陈BOSS和小代说,公司后端最近准备换技术框架了. 小代: 换成啥? ...

  4. 小代介绍Spring Boot

    想要获取更多文章可以访问我的博客 - 代码无止境. 小代很顺利的完成了陈BOSS交代给他搭建Spring Boot示例程序的任务.但是小代是一个乐于学习的程序员,他通过一番学习总结了一篇简单介绍Spr ...

  5. 57. Spring 自定义properties升级篇【从零开始学Spring Boot】

    之前在两篇文章中都有简单介绍或者提到过 自定义属性的用法: 25.Spring Boot使用自定义的properties[从零开始学Spring Boot] 51. spring boot属性文件之多 ...

  6. (13)处理静态资源(自定义资源映射)【从零开始学Spring Boot】

    上面我们介绍了Spring Boot 的默认资源映射,一般够用了,那我们如何自定义目录? 这些资源都是打包在jar包中的,然后实际应用中,我们还有很多资源是在管理系统中动态维护的,并不可能在程序包中, ...

  7. (25)Spring Boot使用自定义的properties【从零开始学Spring Boot】

    spring boot使用application.properties默认了很多配置.但需要自己添加一些配置的时候,我们应该怎么做呢. 若继续在application.properties中添加 如: ...

  8. 从零一起学Spring Boot之LayIM项目长成记(五)websocket

    前言 距离上一篇已经比较久的时间了,项目也是开了个头.并且,由于网上的关于Spring Boot的websocket讲解也比较多.于是我采用了另外的一个通讯框架 t-io 来实现LayIM中的通讯功能 ...

  9. 65.什么是IOC?【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 这个小节吧,是无意当中看了一篇文章,觉得介绍的特别好,引用到我的博客中,让大家也乐下.那么他是怎么解说IOC的呢?看如下: 套用好莱坞的一句名言就 ...

随机推荐

  1. QAbstractItemView为截断的项显示ToolTip(使用事件过滤)

    在Qt中想要为QAbstractItemView中长度不够而使得内容被截断的项显示ToolTip,Qt官网有一篇文章介绍使用事件过滤器来显示太长的项,但是没有涵盖图标的情况.显示列头项太长的情况等等, ...

  2. 基于mipsel编译Qt4.6.2版本(有具体参数和编译时遇到的问题)

    1.使用的configure配置为:./configure -embedded mips -little-endian -xplatform qws/linux-mips-g++ -prefix /o ...

  3. TStringGrid多选的复制与拷贝

    uses Clipbrd; function StringGridSelectText(mStringGrid: TStringGrid): string; var   I, J: Integer; ...

  4. C#每天进步一点--事件

    事件:如果类型定义了事件成员,那么类型就可以通知其他对象发生了特定的事情.例如,Button类提供了一个名为Click的事件.应用程序中的一个或者多个对象可能想接收关于这个事件的通知,以便在Butto ...

  5. UbuntuServer添加软件源列表

    要使用Ubuntu前,我们一般都要先做好工具!特别是对于安装这一块~~~~ 1.配置前,先做个配置文件的备份: $sudo cp /etc/apt/sources.list /etc/apt/sour ...

  6. 条款16:成对使用new和delete时要使用相同的形式

    请牢记: 如果在new表达式中使用[],必须在相应的delete表达式中也使用[]. new[]  对应  delete[] 如歌在new表达式中不适用[],一定不要在相应的delete表达式中使用[ ...

  7. Md2All:好用的markdown文件转换工具,文章迁移微信公众号的利器

    目录 简介 使用体验 极速上手 更多功能 总结 简介 markdown以简单的语法和强大的功能,征服了无数技术创作者,几乎主流的技术博客网站都开始支持markdown语言撰写博客.但是微信公众号的文章 ...

  8. 深入解析Hyperledger Fabric启动的全过程

    在这篇文章中,使用fabric-samples/first-network中的文件进行fabric网络(solo类型的网络)启动全过程的解析.如有错误欢迎批评指正. 至于Fabric网络的搭建这里不再 ...

  9. 洛谷 题解 UVA658 【这不是bug,而是特性 It's not a Bug, it's a Feature!】

    [题意] 补丁在修正\(BUG\)时,有时也会引入新的\(BUG\),假定有\(n(n<=20)\)个潜在\(BUG\),和\(m(m<=100)\)个补丁,每个补丁用两个长度为\(n\) ...

  10. 【需要重新维护】Redis笔记20170811视频

    很多内容都是抄的,个人记录 1.windows下初见 安装 进入目录 修改配置文件(暂时使用默认,未配置环境变量) 目录下:redis-server.exe启动服务 新建命令提示符,目录下,redis ...