Quarkus实战:专为Kubernetes而优化的Java解决方案
上QQ阅读APP看书,第一时间看更新

4.1 使用自定义属性配置应用程序

问题

如何使用自定义属性配置Quarkus应用程序?

解决方案

Quarkus使用了Eclipse MicroProfile规范,其中之一就是配置规范,但是为了简化配置,Quarkus只使用一个文件来处理所有的配置,即application.properties,这个文件必须放在classpath的根目录下。

这个文件可以用来配置Quarkus的属性,比如日志或默认路径、Quarkus扩展(如数据源或Kafka),或者为应用程序定义的自定义属性。你将在本书中看到所有这些属性的配置,但本节主要讲自定义属性的配置。

打开src/main/resources/application.properties文件,添加以下属性:

你可以通过在字段中使用org.eclipse.microprofile.config.inject.ConfigProperty注解来注入在application.properties中定义的属性值。

打开org.acme.quickstart.GreetingResource.java,注入greeting.message属性值:

❶注入greeting.message属性的值

❷将field放置在包保护的范围内

❸返回配置值

当使用GraalVM和反射时,出于性能方面的考虑,建议你在包保护的范围内使用,这些field的值会在运行时被注入。你可以在Quarkus CDI参考指南(https://oreil.ly/8e1Sd)中阅读关于它的更多内容。

在一个新的终端窗口中请求/hello,可以看到输出结果是application.properties中配置的值:

如果你想给一个配置属性提供默认值,而不是要求必须设置,可以使用@ConfigProperty注解的defaultValue参数。

打开org.acme.quickstart.GreetingResource.java文件,注入greeting.upper-case属性值:

❶将greeting.upper-case属性的默认值设置为true

在终端窗口中请求/hello/optional,可以看到输出结果的字符是大写的:

也支持给属性设置多个值——可以根据需要或喜好将field类型定义为Arrays、java.util.List、java.util.Set中的一种。属性值的分隔符是逗号(,),转义符是反斜杠(\)。

打开src/main/resources/application.properties文件,并添加以下有三个值的属性:

打开org.acme.quickstart.GreetingResource.java并注入greeting.suffix属性值:

在终端窗口中请求/hello/list,可以看到输出结果中包含greeting.suffix属性的第二个值:

应用程序也支持YAML格式的配置。在这种情况下,配置文件的名字为application.yamlapplication.yml

要使用YAML格式的配置文件,你需要添加config-yaml扩展:

例如以下使用properties格式的配置文件:

等效的YAML格式是:

❶简单属性的结构设置

❷profile(配置文件)可以使用引号包含

❸当有子键时,~用来指代没有前缀的部分

讨论

Eclipse MicroProfile Configuration自带以下内置的转换器,可将配置值映射到Java对象中:

·boolean和java.lang.Boolean,值为true、1、YES、Y和ON代表真,其他代表假

·byte和java.lang.Byte

·short和java.lang.Short

·int和java.lang.Integer

·long和java.lang.Long

·float和java.lang.Float

·double和java.lang.Double

·char和java.lang.Character

·java.lang.Class,根据调用Class.forName的结果生成

如果内置的转换器或自定义转换器存在,则使用discovered/found方法实例化转换器对象,并传递字符串参数进行转换。如果内置的转换器或自定义转换器不存在,则在目标对象中检查以下方法:

·目标类型具有public static T of(String)方法

·目标类型具有public static T valueOf(String)方法

·目标类型具有一个参数为String的公有构造函数

·目标类型具有public static T parse(CharSequence)方法