第 7 章 属性表达式
属性表达式是属性引用和纯文本字符串的组合,可用于替换配置中属性值。
与变量一样,您可以使用 Quarkus 中的属性表达式来替换配置属性的值,而不是硬编码它。当 java.util.Properties 从应用中的配置源读取属性值时,会解析属性表达式。
这意味着,如果在编译时读取配置属性,则属性表达式也会在编译时解析。如果在运行时覆盖了 configuration 属性,则其值会在运行时解析。
属性表达式可使用多个配置源解析。这意味着,您可以使用在一个配置源中定义的属性值来扩展您在另一个配置源中使用的属性表达式。
如果无法解析表达式中的属性值,并且您没有为表达式设置默认值,则您的应用程序会遇到 NoSuchElementException。
7.1. 属性表达式用法示例 复制链接链接已复制到粘贴板!
在本节中,您可以找到如何在配置 Quarkus 应用程序时如何使用属性表达式来获得更大的灵活性的示例。
替换配置属性的值:
您可以使用属性表达式来避免配置中硬编码属性值。使用
${<property_name>}语法编写引用配置属性的表达式,如下例所示:application.properties
remote.host=quarkus.io callable.url=https://${remote.host}/remote.host=quarkus.io callable.url=https://${remote.host}/Copy to Clipboard Copied! Toggle word wrap Toggle overflow callable.url属性的值解析为https://quarkus.io/。设置特定于特定配置配置文件的属性值:
在以下示例中,
%dev配置配置文件和默认配置配置集被设置为将数据源连接 URL 与不同主机地址搭配使用。根据启动应用程序的配置配置集,您的数据源驱动程序会使用您为配置集设置的数据库 URL:application.properties
%dev.quarkus.datasource.jdbc.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false quarkus.datasource.jdbc.url=jdbc:mysql://remotehost:3306/mydatabase?useSSL=false
%dev.quarkus.datasource.jdbc.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false quarkus.datasource.jdbc.url=jdbc:mysql://remotehost:3306/mydatabase?useSSL=falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以通过为每个配置配置集设置自定义
application.server属性的不同值来实现同样的结果。然后,您可以引用应用程序的数据库连接 URL 中的属性,如下例所示:application.properties
%dev.application.server=localhost application.server=remotehost quarkus.datasource.jdbc.url=jdbc:mysql://${application.server}:3306/mydatabase?useSSL=false%dev.application.server=localhost application.server=remotehost quarkus.datasource.jdbc.url=jdbc:mysql://${application.server}:3306/mydatabase?useSSL=falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow application.server属性根据您在运行应用程序时选择的配置集解析为适当的值。设置属性表达式的默认值:
您可以为属性表达式定义默认值。如果扩展表达式所需的属性值没有从任何配置源解析,则quarkus 使用默认值。您可以使用以下语法设置表达式的默认值:
${<expression>:<default_value>}${<expression>:<default_value>}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例中,数据源 URL 中的属性表达式使用
mysql.db.server作为application.server属性的默认值:application.properties
quarkus.datasource.jdbc.url=jdbc:mysql://${application.server:mysql.db.server}:3306/mydatabase?useSSL=falsequarkus.datasource.jdbc.url=jdbc:mysql://${application.server:mysql.db.server}:3306/mydatabase?useSSL=falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 嵌套属性表达式:
您可以通过在另一个属性表达式中嵌套属性表达式来编写属性表达式。当扩展嵌套属性表达式时,内部表达式会首先扩展:
${<outer_property_expression>${<inner_property_expression>}}${<outer_property_expression>${<inner_property_expression>}}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 多个属性表达式:
您可以将两个或多个属性表达式接合在一起,如下所示:
${<first_property>}${<second_property>}${<first_property>}${<second_property>}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将属性表达式与环境变量合并:
您可以使用属性表达式来替换环境变量的值。以下示例中的表达式替换了为
HOST环境变量设置的值,作为application.host属性的值。如果没有设置HOST环境变量,application.host将使用remote.host属性的值作为默认值:application.properties
remote.host=quarkus.io application.host=${HOST:${remote.host}}remote.host=quarkus.io application.host=${HOST:${remote.host}}Copy to Clipboard Copied! Toggle word wrap Toggle overflow