小代學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:學習不止,碼不停蹄!若是您喜歡個人文章,就關注我吧!

掃碼關注「代碼無止境」
相關文章
相關標籤/搜索