大家一起来学习如何使用spring.factories

前言

starter的使用在springboot项目中可以说是非常常见,可能有些朋友在使用springboot项目的时候只是在网络上找了一篇如何创建一个springboot,如何又和mybatismybatis-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_第1张图片
  • spring.factories配置文件指定的都是mybatis-plus独有的配置,里边对应的配置类将会处理所有需要加载的信息,所以我们自己创建的starter也需要按照这样的步骤来创建
  • 下边是MybatisPlusAutoConfiguration.class
    大家一起来学习如何使用spring.factories_第2张图片
  • 要成功被主程序加载到,starter还需要在pom文件中引入spring-boot-autoconfigure的依赖,因为注解@EnableAutoConfiguration对应的jar包就是spring-boot-autoconfigure如果没有引入此jar,那么spring.factories中配置的处理程序不会被主程序处理

2、自己创建一个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接口实现类的扫描路径
    大家一起来学习如何使用spring.factories_第3张图片
  • 如果你使用了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、读取额外的配置文件

  1. 可以通过@Value注解来获取配置文件中的配置信息
  2. 创建一个AutoConfiguration来自动注入
  3. 读取配置文件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
  1. 创建一个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;
}
  1. 创建一个DataSourceAutoConfiguration.java交给EnableAutoConfiguration处理的配置类
    大家一起来学习如何使用spring.factories_第4张图片
  2. 通过命令mvn clean install打包集成到项目中,然后调用接口试试效果吧

4、让自定义的application-xxx.properties配置文件也能像springmybatis的配置一样能够有提示信息

如果你使用的是idea编程的话,你可能会发现application-rm.properties配置文件里边的所有配置都被标黄了,而且没有任何提示,感觉挺难受的,当然要处理这种情况也很简单

  1. 在项目的pom.xml文件中引入依赖

	org.springframework.boot
	spring-boot-configuration-processor
	2.4.5

  1. 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"
    }
  ]
}
  1. 使用命令mvn clean install打包,然后你可以在jar包的META-INF文件下找到一个json文件spring-configuration-metadata.json,再刷新项目,重新编辑配置文件application-rm.properties,你会发现标黄的配置已经不见了,并且出现了如spring一样的提示信息

你可能感兴趣的:(Springboot专栏,配置文件,spring,factories,matadata.json)