想要获取更多文章可以访问我的博客 - 代码无止境 https://itweknow.cn/ .
使用 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》 https://itweknow.cn/blog-site/posts/87120304.html . 在开始实现之前, 小代同学查询了一下 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 过来然后稍作修改, 主要有以下几点修改:
定义了 MyBatisProperties 类, 这个类主要是从配置文件中读取 Mapper.xml 的地址. 配置会话工厂 sqlSessionFactory 的时候设置的 MapperLocation 的路径就是从这里获取的.
去除了之前配置类上的 @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