
4.9 创建自定义配置源
问题
如何从其他配置源而不是从application.properties文件加载配置参数?
解决方案
Quarkus使用Eclipse MicroProfile Configuration规范来实现所有关于配置的逻辑。该规范提供了org.eclipse.microprofile.config.spi.ConfigSource Java SPI(https://oreil.ly/o0A51)接口,以实现一种自定义的方式来加载配置属性,而不是使用Quarkus提供的默认方式加载配置属性。
例如,你可以从数据库、XML文件或REST API中加载配置属性。
让我们创建一个简单的内存配置源,它从实例化时填充的Map中获取配置属性。创建一个名为org.acme.quick-start.InMemoryConfigSource.java的新类:
❶用属性填充Map
❷用于确定配置值的重要程度,数值越大,优先级越高
❸以Map的形式获取所有属性,本例为直接获取
❹获取单个属性的值
❺返回此配置源的名称
你需要将其注册为一个Java SPI。在src/main/resources/META-INF中创建services文件夹,然后在services文件夹里创建一个名为org.eclipse.microprofile.config.spi.ConfigSource的文件,内容如下:
最后,你可以修改org.acme.quickstart.GreetingResource.java类来注入此属性:
❶注入InMemoryConfigSource中定义的属性值
在终端窗口中请求/hello/color,可以看到输出的结果是自定义配置源中的值:
讨论
每个ConfigSource都有一个指定的序数值,当同一应用程序定义了多个ConfigSource时,该序数用于设置从ConfigSource中获取值的重要程度。序数值较高的ConfigSource会比序数值较低的ConfigSource优先使用。以下面列表中的默认值作为参考,在所有的配置源上都会使用系统属性,如果没有找到其他的ConfigSource,则使用src/main/resources目录下的application.properties文件:
·系统属性为400
·环境变量为300
·config目录下的application.properties为260
·项目中的application.properties为250