关键词:
Java 通用配置
(一)设计
(二)JVM和环境变量实现
本系列参考实现:
https://gitee.com/mybatis-mapper/config
https://github.com/mybatis-mapper/config
在写系列博客时,总有一两篇内容简单到可有可无…
本篇内容先选择了最简单的 JVM 和环境变量进行实现,实现过程中可以了解一个简单的规则,SPI 的配置等等,算是复杂实现前的开胃小菜。
JVM 参数
直接实现前面定义的 Config
接口就可以,系统变量太简单,以至于没有内容可讲:
package io.mybatis.config.defaults;
import io.mybatis.config.Config;
/**
* 读取环境变量值
*
* @author liuzh
*/
public class SystemConfig implements Config
@Override
public String getStr(String key)
return System.getProperty(key);
@Override
public int getOrder()
return SYSTEM_ORDER;
系统变量 JVM 参数方式是目前优先级最高的配置方式,代码中可以看到是 System.getProperty
方式读取的,所以在代码中可以通过 System.setProperty("key", "value");
进行设置,只要在 getProperty
前设置了,读取都会有效。
除了代码方式外,JVM 真正常用的地方还是在执行代码时,例如 Spring Boot 可执行 Jar 包运行时:
java -Dkey=value -jar xxxx-boot.jar
假如我们通过系统服务的方式运行 java 程序,通过JVM设置的参数是比较死板的,只是相对配置文件方便了一些,如果是在容器环境运行,由于优先级顺序很高,这种方式还会导不能通过环境变量进行覆盖,所以JVM覆盖值的用法在云原生环境使用较少。
环境变量
实现比 JVM 复杂了一点点,代码如下:
package io.mybatis.config.defaults;
import io.mybatis.config.Config;
/**
* 读取环境变量值
*
* @author liuzh
*/
public class EnvConfig implements Config
@Override
public String getStr(String key)
String value = System.getenv(key);
if (value != null)
return value;
key = key.toUpperCase().replaceAll("\\\\.", "_").replaceAll("-", "");
return System.getenv(key);
@Override
public int getOrder()
return ENV_ORDER;
由于不同操作系统对环境变量有不同的限制或规范,从环境变量取值时一般都先通过原始 key
尝试获取,如果能拿到,就不需要做处理,如果没有再按下面规则转换:
- 转换为大写形式
- 替换
.
为下划线_
- 去掉所有
-
这里参考的 Spring 规则
在云原生(使用容器镜像或K8s)中,因为配置环境变量非常方便,所以非常有必要支持,而且推荐通过环境变量进行覆盖。
如果你用到了配置中心,可以优先配置中心方式。
在 K8s 中用 ConfigMap 或者挂载 ConfigMap 卷覆盖配置文件都是很方便的选择。
JAVA SPI 配置
在 src/main/resources
资源目录下面创建 META-INF/services
目录,在新建的目录下面创建 io.mybatis.config.Config
文件,文件名就是接口名,在文件中配置上面两个实现:
io.mybatis.config.defaults.EnvConfig
io.mybatis.config.defaults.SystemConfig
JAVA SPI 初始化
在 ConfigHelper
中通过 ServiceLoader.load(Config.class)
初始化了 Config
接口的实现:
private static void init()
if (CONFIGS == null)
synchronized (ConfigHelper.class)
if (CONFIGS == null)
CONFIGS = new ArrayList<>();
ServiceLoader<Config> serviceLoader = ServiceLoader.load(Config.class);
for (Config config : serviceLoader)
CONFIGS.add(config);
CONFIGS.sort(Comparator.comparing(Config::getOrder).reversed());
CONFIGS.forEach(c -> log.debug("加载配置类: " + c.getClass().getName()));
这里通过 双重检查锁(Double-Checked Locking)对 private static volatile List<Config> CONFIGS;
进行初始化。
获取所有 Config
实现后,根据 Comparator.comparing(Config::getOrder).reversed()
进行倒序排序,所以这里的数字越大优先级越高。
简单测试
测试代码如下:
public class MainTest
public static void main(String[] args)
System.out.println(ConfigHelper.getStr("hello"));
System.out.println(ConfigHelper.getBoolean("enabled"));
直接用 main
方法测试,不做任何配置的情况下,运行上面代码输出如下:
null
false
在IDE中配置JVM参数如下:
-Dhello=JVM你好 -Denabled=true
再次运行,输出如下内容:
JVM你好
true
删除JVM参数后,配置环境变量如下(IDEA启动后,直接配置系统环境变量是无效的,需要完全关闭IDEA启动才可能有效,可以直接通过IDEA提供的环境变量方式进行配置):
hello=ENV你好;ENABLED=true
输出内容如下:
ENV你好
true
接下来同时配置 JVM 和环境变量:
此时的输出结果如下:
JVM你好
true
可以看到 JVM 优先级高于环境变量。
本篇内容很简单,如果你对 SPI 不是很熟悉,可以搜索相关的文章进行了解,如果你们现有系统想支持这两种扩展方式,可以参考这里的实现在自己系统中增加这两种读取参数的方式。在后续的文章中会开始介绍用户自定义配置和版本配置,因为涉及到读取文件,相对复杂了很多,难度增加了不少,不好理解时多动手试试。
java通用配置jvm和环境变量实现(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config在写系列博客时,总有一两篇内容简单到可有可无…本篇内容先选择了最简单... 查看详情
java通用配置用户配置实现(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config用户配置用户和版本配置都需要读取文件,但是两 查看详情
java通用配置用户配置实现(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config用户配置用户和版本配置都需要读取文件,但是两 查看详情
java通用配置扩展示例(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情
java通用配置扩展示例(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情
java通用配置集成spring(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/my 查看详情
java通用配置集成spring(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/my 查看详情
java通用配置1.1.0版本发布(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情
java通用配置1.1.0版本发布(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring(六)扩展示例本系列参考实现:https://gitee.com/mybatis-mapper/config 查看详情
jdk环境变量配置(代码片段)
Java虚拟机(JVM)JVM(JavaVirtualMachine):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java最具吸引力的特性之一。我们编写的Java代码,都运行在JVM之上。跨平台:任何软件的运行,都必须要运... 查看详情
java通用配置集成spring(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现(五)集成Spring本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config作... 查看详情
java通用配置版本配置实现(代码片段)
Java通用配置(一)设计(二)JVM和环境变量实现(三)用户配置实现(四)版本配置实现本系列参考实现:https://gitee.com/mybatis-mapper/confighttps://github.com/mybatis-mapper/config版本配置设计版本配置是... 查看详情
vue环境变量和模式(设置通用baseurl)(代码片段)
VueCLI3 中可以通过设置环境变量和模式,可以根据不同模式加载不同的baseUrl地址。具体如下:一、环境变量1.描述在Vue项目的根目录下可以创建以下文件来设置环境变量.env#在所有的环境中被载入.env.local#在所有的环境中... 查看详情
java基础java环境搭建(代码片段)
...章目录一、前期准备1.基础知识2.软件二、安装1.JDK安装2.配置环境变量三、总结一、前期准备1.基础知识JVM:JavaVirtualMachine,也就是Java虚拟机,它是Java运行的虚拟环境,我们所编写的代码都运行在JVM上。而JVM作为... 查看详情
那年java那些事01—环境变量和集成开发工具(代码片段)
目录 一、环境变量的安装和配置(JDK)1.1环境变量1.2分类1.3JDK的安装与配置二、Java常用集成开发工具的安装和配置2.1Eclipse的安装和配置2.2IDEA2021.1的安装和配置(推荐)俗语云:工欲善其事,必先利其器。想要学习... 查看详情
linux-linux下java安装路径查找;配置java环境变量(代码片段)
一、查看Java的安装路径1、已经安装好了JDK,也配置了环境变量1、执行java-versionjava-version出现了版本号,表示安装过了JDK,配置了环境变量2、在配置过jdk的情况下,执行java-verbose指令,在打印出的文本最后两... 查看详情
java环境变量配置(代码片段)
Java环境变量配置安装Java后,需要配置Java在windows操作系统中的环境变量,方便应用通过系统环境变量中的配置,找到并使用Java提供的SDK,配置方法非常简单。环境变量的位置在Windows操作系统中,点击“计算机”,选择“属性”... 查看详情
elasticsearch介绍(代码片段)
...前流行的企业级搜索引擎。 二、Elasticsearch的安装和配置 1、下载并解压相应的安装包,并配置ES_HOME下载链接貌似被屏蔽了,需要开代理下载。 2、在bin目录下启动elasticsearch.bat即可运行Elasticsearch,通过浏览器访问local... 查看详情