Java 通用配置扩展示例
Posted isea533
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 通用配置扩展示例相关的知识,希望对你有一定的参考价值。
Java 通用配置
(一)设计
(二)JVM和环境变量实现
(三)用户配置实现
(四)版本配置实现
(五)集成 Spring
(六)扩展示例
本系列参考实现:
https://gitee.com/mybatis-mapper/config
https://github.com/mybatis-mapper/config<dependency> <groupId>io.mybatis</groupId> <artifactId>mybatis-config</artifactId> <version>1.0.0</version> </dependency>
前面的三、四、五各实现一种配置方式,只看到了代码,还没看到具体的使用效果,所以这一篇用一个具体的例子来演示如何使用用户配置和版本配置,通过单元测试来查看用法和效果。
我们先回到第一篇中的起因,mybaits-mapper 中不想在每个字段上增加注解,因此底层的 mybatis-provider 项目中增加了 style
样式,在实体上配置样式后,只要字段符合规则,就不需要加注解配置,没有这个功能前相当于字段名和表名是直接映射的,但是多数情况下,我们都希望字段和列能按照驼峰转下划线方式进行转换,所以这种方式就是新版本的默认值,为了理论上的兼容低版本,在低版本情况下默认方式为字段名直接就是列名,所以就会用到版本配置的功能,一般版本配置和用户配置是成对的,用户肯定想自己能指定默认值,选择版本只能兼容版本升级带来的变化。
下面就开始在 mybatis-provider 项目开始集成用户配置和版本配置。
用户配置
package io.mybatis.provider.config;
import io.mybatis.config.defaults.UserConfig;
/**
* mybatis-provider 用户配置,优先级高于版本配置,可以覆盖版本默认值
* <p>
* 可以通过 provider.properties 属性指定自定义的配置路径或文件名
*
* @author liuzh
*/
public class ProviderUserConfig extends UserConfig
@Override
protected String getConfigKey()
return "io.mybatis.provider.properties";
@Override
protected String getConfigName()
return "mybatis-provider";
逻辑都在 UserConfig
封装好了,这里只需要实现两个抽象接口。
用户可以通过 io.mybatis.provider.properties=配置文件
指定其他的路径或者文件名,不指定时会使用默认的 mybatis-provider
作为文件名。
版本配置
package io.mybatis.provider.config;
import io.mybatis.config.defaults.VersionConfig;
/**
* mybatis-provider 提供的默认配置文件,支持根据版本选择
*
* @author liuzh
*/
public class ProviderVersionConfig extends VersionConfig
@Override
protected String getConfigName()
return "mybatis-provider";
@Override
protected String getVersionKey()
return "io.mybatis.provider.version";
版本配置中,配置文件前缀使用的 mybatis-provider
,用户可以通过 io.mybatis.provider.version=v1.0
方式选择要使用的默认版本。
在 src/main/resources
和类名相同的包路径下面有两个配置文件:
- mybatis-provider-v1.0.properties
mybatis.provider.style=normal
- mybatis-provider-v2.0.properties
mybatis.provider.style=lower_underscore
SPI 配置
在 在 src/main/resources
下面创建目录 META-INF
,然后创建文件 io.mybatis.config.Config
,内容为上面实现的两个接口:
io.mybatis.provider.config.ProviderVersionConfig
io.mybatis.provider.config.ProviderUserConfig
到这里用户配置和版本配置就实现好了,下面开始测试功能。
测试功能
先单独测试用户配置和版本配置,最后再针对 ConfigHelper
整体测试。
用户配置测试
在当前测试路径下创建用户配置 mybatis-provider.properties 文件,内容如下:
username=liuzh
email=abel533@gmail.com
编写测试方法如下:
@Test
public void testUserConfig()
Config config = new ProviderUserConfig();
String username = config.getStr("username");
Assert.assertEquals("liuzh", username);
Assert.assertEquals("abel533@gmail.com", config.getStr("email"));
上面测试直接创建了 ProviderUserConfig
,没有通过 ConfigHelper
的 SPI 创建,用户配置中的内容可以直接读取。
注意:
ProviderUserConfig
中会从ConfigHelper
读取配置文件名,所以可以通过io.mybatis.provider.properties=配置文件
修改默认配置文件信息。
版本配置测试
在 Maven 的 src/test/java
下面执行代码时,由于测试代码和正式代码位置不同,会导致找不到版本配置文件,所以测试时需要注意将配置文件复制到 src/test/resources
下面一份,这里测试的内容和上面一样:
@Test
public void testVersionConfig()
Config config = new ProviderVersionConfig();
String style = config.getStr("mybatis.provider.style");
Assert.assertEquals("lower_underscore", style);
// 通过配置指定版本,也可以 JVM 中 -Dio.mybatis.provider.version=v1.1
System.setProperty("io.mybatis.provider.version", "v1.1");
config = new ProviderVersionConfig();
style = config.getStr("mybatis.provider.style");
Assert.assertEquals("normal", style);
// 清除配置,避免对其他测试产生影响
System.clearProperty("io.mybatis.provider.version");
测试代码分为两部分,第一部分默认使用最新的版本配置,第二部分指定了版本号。
ConfigHelper 集成测试
@Test
public void test()
Assert.assertEquals("liuzh", ConfigHelper.getStr("username"));
Assert.assertEquals("abel533@gmail.com", ConfigHelper.getStr("email"));
Assert.assertEquals("lower_underscore", ConfigHelper.getStr("mybatis.provider.style"));
为了验证用户配置优先级高于版本配置,在上面增加的 mybatis-provider.properties 文件添加配置如下:
username=liuzh
email=abel533@gmail.com
# 增加配置,覆盖版本配置
mybatis.provider.style=upper_underscore
此时获取的值就变了:
Assert.assertEquals("upper_underscore", ConfigHelper.getStr("mybatis.provider.style"));
除了这些外,你还可以配合 JVM 和环境变量进行测试。由于 mybatis-provider 中的测试环境没有 Spring,所以在另一个地方测试 Spring 配置。
Spring 集成测试
在 mybatis-mapper-example-springboot 示例中,修改启动类,增加获取配置信息的代码:
package io.mybatis.example.springboot;
import io.mybatis.config.ConfigHelper;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MapperSpringbootApplication implements CommandLineRunner
public static void main(String[] args)
SpringApplication.run(MapperSpringbootApplication.class, args);
@Override
public void run(String... args) throws Exception
System.out.println(ConfigHelper.getStr("mybatis.provider.style"));
直接运行上面代码后,输出内容如下:
lower_underscore
在 application.yaml 配置增加下面属性的设置:
mybatis:
mapper-locations: classpath*:mappers/*.xml
# 追加的内容
provider:
style: upper
再次运行输出如下:
upper
比如增加一些 Spring 特有的配置信息:
System.out.println(ConfigHelper.getStr("spring.datasource.url"));
会输出:
jdbc:mysql://localhost:3306/test?useSSL=false
使用 generator
下面的代码生成器随意生成一些 mybatis-mapper 的代码,然后测试上面 style
的效果。
CREATE TABLE `simple` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
生成实体默认带着所有注解,去掉不必要的注解后如下:
@Entity.Table(value = "simple", autoResultMap = true)
public class Simple
@Entity.Column(id = true)
private Long id;
private String name;
在配置文件中给 Mapper 包配置为 TRACE 方便查看日志:
logging:
level:
io.mybatis.example.springboot.mapper: TRACE
在启动类注入对应的 Mapper,然后调用方法:
@Autowired
SimpleMapper simpleMapper;
@Override
public void run(String... args) throws Exception
Simple simple = new Simple();
simple.setName("liuzh");
System.out.println(simpleMapper.insert(simple));
输出的日志如下:
i.m.e.s.mapper.SimpleMapper.insert : ==> Preparing: INSERT INTO simple(ID,NAME) VALUES (?,?)
i.m.e.s.mapper.SimpleMapper.insert : ==> Parameters: null, liuzh(String)
i.m.e.s.mapper.SimpleMapper.insert : <== Updates: 1
可以看到 upper
配置起到了作用,也就是 mybatis-mapper 中获取配置时,已经可以拿到 Spring Boot 的配置,可以正常通过这种方式配置 mybatis-mapper。
小结
上次写 VFS - 代码生成器预览功能实现 时,就因为写文章改过很多代码,此次也不例外,本来 mybais-config 1.0.0 已经正式发布了,mybatis-provider 使用 mybatis-config 后也发布了 2.0.0 版本,在找时间发布 mybatis-mapper 就可以了。写文章过程中有过一些修改,又增加了不少工作量,后续经过审查后会发布 1.1.0 版本,mybatis-provider 也要有新版本发布,开源不管项目大小,都需要投入很多精力,确实很累,如果你看完这个系列后,有新的想法,欢迎 PR。
本系列参考实现:
https://gitee.com/mybatis-mapper/config
https://github.com/mybatis-mapper/config<dependency> <groupId>io.mybatis</groupId> <artifactId>mybatis-config</artifactId> <version>1.0.0</version> </dependency>
以上是关于Java 通用配置扩展示例的主要内容,如果未能解决你的问题,请参考以下文章