小代学Spring Boot之自定义Starter

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

使用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:学习不止,码不停蹄!如果您喜欢我的文章,就关注我吧!

原文地址:https://www.cnblogs.com/endless-code/p/11229526.html

时间: 2024-07-30 08:14:57

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

小代学Spring Boot之数据源

想要获取更多文章可以访问我的博客?-?代码无止境. 经过一天对Spring Boot的研究,小代同学已经对Spring Boot框架有了一个大概的认识.并且还创建了一个简单的Spring Boot的Web应用程序,如果你还不知道如何创建的话,可以访问<小代学Spring Boot之开篇>这篇文章.下一步陈Boss让小代做的是使用Spring Boot项目连接数据库. 相信我们都知道,在连接数据库的时候我们一般都会使用数据库连接池,这样做的好处在于可以重用数据库资源,还可以统一管理数据库连接,避

小代学Spring Boot之开篇

想要获取更多文章可以访问我的博客?-?代码无止境. 前情提要 小代是一名入职不久的程序员,公司同事都亲切的称他小代.有一天小代的老大陈BOSS和小代说,公司后端最近准备换技术框架了. 小代: 换成啥? 陈BOSS: Spring Boot,听过没? 小代: 当然听说过,就是由Pivotal团队开发的一个新的框架,它主要是简化Spring应用程序的搭建和开发过程. 陈BOSS: 哟呵,想不到你还知道的挺多的.那挺好啊,现在我给你给任务,搭建一个基于一个Spring Boot的Web示例程序,作为公

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

前言 距离上一篇已经比较久的时间了,项目也是开了个头.并且,由于网上的关于Spring Boot的websocket讲解也比较多.于是我采用了另外的一个通讯框架 t-io 来实现LayIM中的通讯功能.本篇会着重介绍我在研究与开发过程中踩过的坑和比较花费的时间的部分. WebSocket 在研究 t-io 的时候,我已经写过关于t-io框架的一些简单例子分析以及框架中关于 websocket 中的编解码代码分析等,有兴趣的同学可以先看一下.因为 在LayIM项目中我会是用到 Showcase D

21. Spring Boot过滤器、监听器【从零开始学Spring Boot】

转载:http://blog.csdn.net/linxingliang/article/details/52069490 上一篇文章已经对定义Servlet 的方法进行了说明,过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet 一样,不清楚的可以查看下上一篇文章(20): 本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener:使用注解 @ServletComponentScan//这个就是扫描相应的Se

从零一起学Spring Boot之LayIM项目长成记(一) 初见 Spring Boot

项目背景 之前写过LayIM的.NET版后端实现,后来又写过一版Java的.当时用的是servlet,websocket和jdbc.虽然时间过去很久了,但是仍有些同学在关注.偶然间我听说了SpringBoot这么个东东,据说是省去了很多繁杂的配置.可以傻瓜式的创建项目,轻轻松松做出一个网站来,那么出于我对LayIM的情有独钟,于是乎想借用它来帮助我学习SpringBoot,并且全程记录,省的以后再走弯路和掌握解决问题的方法.(当然,我也是新手,我的解决方法就是百度,stackovreflow等网

Spring Boot使用模板freemarker【从零开始学Spring Boot(转)

视频&交流平台: à SpringBoot网易云课堂视频 http://study.163.com/course/introduction.htm?courseId=1004329008 à Spring Boot交流平台 http://412887952-qq-com.iteye.com/blog/2321532 [原创文章,转载请注明出处] 103. Spring Boot Freemarker特别篇之contextPath[从零开始学Spring Boot] 最近有好久没有更新博客了,感谢

4. 使用别的json解析框架【从零开始学Spring Boot】

转载:http://blog.csdn.net/linxingliang/article/details/51585921 此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boot完美使用FastJson解析JSON数据[从零开始学Spring Boot] http://412887952-qq-com.iteye.com/blog/2315202

Spring Boot的启动器Starter详解

Spring Boot的启动器Starter详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2)spring-boot-starter-actuator 帮助监控和管理应用. 3)spring-boot-starter-amqp 通

43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】

[视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share à SpringCloud视频 http://study.163.com/course/introduction.htm?courseId=1004638001&a