小代学Spring Boot之自定义Starter

想要获取更多文章能够访问个人博客 - 代码无止境html

使用Spring Boot框架一段时间以后的小代同窗,发如今Spring Boot项目中常常会引入各类各样的Starter,例如Web项目的spring-boot-starter-web以及集成MyBatis时的mybatis-spring-boot-starter。那么这个Starter究竟是些什么呢?java

什么是Starter

通过一番研究,小代同窗了解到Starter主要是Spring Boot用来简化项目依赖的一种形式,好比spring-boot-starter-web中包含了一个Web项目一般所须要的依赖,这样咱们就只须要依赖一个Starter便可,无需一个一个的添加全部的Web项目所需的Jar包,并且咱们还能够经过Starter来作一些自动配置。git

做为一个喜欢研究的程序员,小代同窗就想能不能将以前链接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的形式命名。github

自定义Starter

知道如何命名一个自定义Starter以后,小代同窗根据命名的建议新建了一个mybatis-config-spring-boot-starter的项目。而且将以前集成MyBatis时候添加的依赖所有添加进来了。
添加完依赖以后,咱们还须要一个配置类用来在项目启动时自动配置链接池以及扫描Mapper文件。因此小代同窗新建了一个MyBatisAutoConfiguration类来作这些东西。web

@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过来而后稍做修改,主要有如下几点修改:spring

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

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

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.itweknow.mybatisconfigspringbootstarter.config.MyBatisAutoConfiguration
复制代码

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

Starter的使用

小代同窗为了测试本身定义的Starter,特意新建了一个项目starter-test。而后小代同窗充满信心地将上面定义的Starter添加到了测试项目中。bash

<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:学习不止,码不停蹄!若是您喜欢个人文章,就关注我吧!

扫码关注“代码无止境”
相关文章
相关标签/搜索