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
中配置的处理程序不会被主程序处理starter
吧springboot
项目pom.xml
文件
org.springframework.boot
spring-boot-starter
2.4.5
org.springframework.boot
spring-boot-autoconfigure
2.4.5
org.springframework.boot
spring-boot-starter-jdbc
2.4.5
com.baomidou
mybatis-plus-boot-starter
3.5.2
org.springframework.boot
spring-boot-autoconfigure
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
5.1.47
org.projectlombok
lombok
provided
1.18.22
pom.xml
文件中不需要引入spring-boot-starter-web
,也不需要继承springboot
的父包spring-boot-starter-parent
ComponentScanAndMapperScanAutoConfiguration.java
,此配置是告诉mybatis-plus
需要扫描的mapper
接口路径以及service
接口实现类的扫描路径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
项目集成进来调用自定义的接口进行测试了@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
打包集成到项目中,然后调用接口试试效果吧application-xxx.properties
配置文件也能像spring
和mybatis
的配置一样能够有提示信息如果你使用的是idea编程的话,你可能会发现application-rm.properties
配置文件里边的所有配置都被标黄了,而且没有任何提示,感觉挺难受的,当然要处理这种情况也很简单
pom.xml
文件中引入依赖
org.springframework.boot
spring-boot-configuration-processor
2.4.5
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
一样的提示信息