前言
starter的使用在springboot项目中可以说是非常常见,可能有些朋友在使用springboot项目的时候只是在网络上找了一篇如何创建一个springboot,如何又和mybatis或mybatis-plus集成,然后又引入缓存机制redis,消息队列rabbitmq等等,感觉很好用,只需要pom文件中引入相应的依赖就可以了,其他的都不需要管,确实是这样,可能在很长一段时间都在以这样的方式写项目,但久而久之,你可能会在某一次项目中遇到这样一种情况,让你自己写一个工具包可以在另一个环境中集成,这其实很简单,大家都会写这样的工具包。那工具包要求使用springboot,数据库操作使用mybatis-plus,这种情况下,是否有办法来解决呢。我们都知道一个完整的springboot+mybatis-plus的项目都是事先约定好需要扫描的文件以及mybatis-plus需要扫描的xml路径的,我自己搞了一个springboot+mybatis-plus的项目要提供给另一个同样使用springboot框的使用,别人的包路径和我的基本可以确定是不一样的,人家确定了包的扫描,那也只是针对他的项目,我的项目不是那么扫描的,那不就没办法扫描到我的service,mapper了嘛,那别人调用我的项目能使用嘛,显然是不能使用的,情况严重可能连别人的项目都启动不了了。难道没办法解决这种问题了吗,当然不是啦,如果不能处理这种情况,那我们是怎么将mybatis-plus整合到springboot的呢,其实就是在pom文件里边引入mybatis-plus-boot-starter的依赖包就可以了。
一、简单介绍一下mybatis-plus被成功装载的过程
mybatis-plus能被spring管理起来主要是项目启动类的联合注解@SpringBootApplication有一个自动装配的注解@EnableAutoConfiguration,只要有这个注解项目在启动的时候就会在引入的jar中找是否存在spring.factories的配置文件,如果找到此配置文件,将会根据此配置文件找到对应的配置类,处理jar内部需要提取的配置信息以及将需要加载到的component交给spring管理- 下边是
spring.factories和对应的配置信息

spring.factories配置文件指定的都是mybatis-plus独有的配置,里边对应的配置类将会处理所有需要加载的信息,所以我们自己创建的starter也需要按照这样的步骤来创建- 下边是
MybatisPlusAutoConfiguration.class

- 要成功被主程序加载到,
starter还需要在pom文件中引入spring-boot-autoconfigure的依赖,因为注解@EnableAutoConfiguration对应的jar包就是spring-boot-autoconfigure如果没有引入此jar,那么spring.factories中配置的处理程序不会被主程序处理
2、自己创建一个starter吧
- 先创建一个极简的
springboot项目 - 修改
pom.xml文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<version>1.18.22</version>
</dependency>
</dependencies>
pom.xml文件中不需要引入spring-boot-starter-web,也不需要继承springboot的父包spring-boot-starter-parent- 创建配置类
ComponentScanAndMapperScanAutoConfiguration.java,此配置是告诉mybatis-plus需要扫描的mapper接口路径以及service接口实现类的扫描路径

- 如果你使用了xml文件来操作数据库,那么需要轻微的调整一下主程序的
application.properties或者application.yml配置文件的mybatis-plus.mapper-locations的配置,此配置是告诉mybatis-plus需要扫描的xml路径,但如果放在jar里他是扫描不到的,所以需要把配置改为classpath*:/**/**/*Mapper.xml,这是告诉mybatis-plus如果resources下找到不到,则扫描jar包里的resources如果都没有那将会报错
mybatis-plus.mapper-locations=classpath*:/**/**/*Mapper.xml
- 如果是
mybatis则使用下边的配置
mybatis.mapper-locations=classpath*:/**/**/*Mapper.xml
- 注意:项目引入的
jar包他会自动扫描application.propertis配置文件,因此不需要额外创建配置文件,他会加载主程序的application.properties,所以数据源和mybatis-plus的相关配置都不需要额外添加。还需要注意的是由于starter不属于web项目因此既不需要application.properties的配置文件也不需要SpringbootApplication的启动类,如果有的话可以删除掉 - 最后的话通过命令
mvn clean install进行打包,然后用其他的springboot项目集成进来调用自定义的接口进行测试了
3、读取额外的配置文件
- 可以通过
@Value注解来获取配置文件中的配置信息 - 创建一个
AutoConfiguration来自动注入 - 读取配置文件
application-rm.properties的内容,配置文件的内容如下
rm.datasource.username=xxx
rm.datasource.password=xxx
rm.datasource.url=jdbc:mysql://xxxxxx:3306/xxxx?serverTimezone=Asia/Shanghai&useLegacyDatetimeCode=false&useSSL=false&nullNamePatternMatchesAll=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
rm.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
rm.datasource.minimum-idle=5
rm.datasource.maximum-pool-size=50
rm.datasource.max-lifetime=30000
rm.datasource.connection-test-query=SELECT 1 FROM DUAL
- 创建一个
DataSourceConnection.java类来加载配置文件中的信息
/**
* ignoreResourceNotFound=true表示如果配置文件找不到,则使用默认值,避免找不到配置文件报错,此时当前的对象只是一个普通实体类
*/
@PropertySource(ignoreResourceNotFound = true, value = {"classpath:application-rm.properties"})
@ConfigurationProperties(prefix = "rm.datasource")
@Configuration
@Data
public class DataSourceConnection {
/**
* 数据库登录名
*/
private String username;
/**
* 数据库登录密码
*/
private String password;
/**
* 数据库连接地址
*/
private String url;
/**
* 数据库驱动
*/
private String driverClassName;
/**
* 数据库连接的最小空闲连接
*/
private String minimumIdle;
/**
* 数据库连接池最大连接数量
*/
private String maximumPoolSize;
/**
* 数据连接的最大生命周期
*/
private String maxLifetime;
/**
* 测试数据库连接的脚本
*/
private String connectionTestQuery;
}
- 创建一个
DataSourceAutoConfiguration.java交给EnableAutoConfiguration处理的配置类

- 通过命令
mvn clean install打包集成到项目中,然后调用接口试试效果吧
4、让自定义的application-xxx.properties配置文件也能像spring和mybatis的配置一样能够有提示信息
如果你使用的是idea编程的话,你可能会发现application-rm.properties配置文件里边的所有配置都被标黄了,而且没有任何提示,感觉挺难受的,当然要处理这种情况也很简单
- 在项目的
pom.xml文件中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.4.5</version>
</dependency>
- 在
resources目录下创建一个META-INF下创建一个additional-spring-configuration-metadata.json的文件,引入如下配置
{
"properties": [
{
"name": "rm.datasource.username",
"type": "java.lang.String",
"sourceType": "com.xxx.xxx.xxx.DataSourceConnection"
},
{
"name": "rm.datasource.password",
"type": "java.lang.String",
"sourceType": "com.xxx.xxx.xxx.DataSourceConnection"
},
{
"name": "rm.datasource.url",
"type": "java.lang.String",
"sourceType": "com.xxx.xxx.xxx.DataSourceConnection"
},
{
"name": "rm.datasource.driver-class-name",
"type": "java.lang.String",
"sourceType": "com.xxx.xxx.xxx.DataSourceConnection"
},
{
"name": "rm.datasource.minimum-idle",
"type": "java.lang.Integer",
"sourceType": "com.xxx.xxx.xxx.DataSourceConnection"
},
{
"name": "rm.datasource.maximum-pool-size",
"type": "java.lang.Integer",
"sourceType": "com.xxx.xxx.xxx.DataSourceConnection"
},
{
"name": "rm.datasource.max-lifetime",
"type": "java.lang.Integer",
"sourceType": "com.xxx.xxx.xxx.DataSourceConnection"
},
{
"name": "rm.datasource.connection-test-query",
"type": "java.lang.String",
"sourceType": "com.xxx.xxx.xxx.DataSourceConnection"
}
]
}
- 使用命令
mvn clean install打包,然后你可以在jar包的META-INF文件下找到一个json文件spring-configuration-metadata.json,再刷新项目,重新编辑配置文件application-rm.properties,你会发现标黄的配置已经不见了,并且出现了如spring一样的提示信息

本文介绍了如何利用`spring.factories`进行组件注册,包括其在项目启动时的角色,如何创建自己的`spring.factories`文件,如何读取额外的配置文件,以及如何为自定义配置文件添加IDE提示。通过这些步骤,可以实现自定义工具包在不同项目中的无缝集成。
4942

被折叠的 条评论
为什么被折叠?



