1. 概述

在本教程中,我们将介绍如何在 Scala 中读取环境变量(Environment Variables)

环境变量 是操作系统层面定义的键值对配置项,应用程序可以从中读取运行时所需的配置信息。通常我们会用它来指定一些外部依赖的路径、数据库连接地址等配置项。

2. 如何读取环境变量

和大多数编程语言一样,Scala 提供了多种方式来读取系统环境变量。虽然方法不同,但使用起来大同小异,更多是风格上的选择问题。

2.1. 使用 Scala 的 sys 对象 ✅推荐

在 Scala 中,最常用且最符合语言风格的方式是通过 sys.env 来访问环境变量。它会将所有环境变量封装成一个不可变的 Map[String, String]

scala> sys.env
res0: scala.collection.immutable.Map[String,String] = HashMap(
  JAVA_MAIN_CLASS_27606 -> scala.tools.nsc.MainGenericRunner,
  PWD -> /private/tmp,
  JAVA_ARCH -> x86_64
)

scala> sys.env.get("PWD")
res1: Option[String] = Some(/private/tmp)

这个方法本质上是对 Java 原生 API 的一层封装,但它更“Scala 化”——不会返回 null,而是返回 Option 类型,避免了空指针的风险。

2.2. 使用 scala.util.Properties 工具类

还有一种不太常见的方法是使用 scala.util.Properties 对象提供的工具方法:

scala> scala.util.Properties.envOrElse("PWD", "undefined")
res0: String = /private/tmp

scala> scala.util.Properties.envOrElse("RANDOM-VAR-FOO", "undefined")
res1: String = undefined

scala> scala.util.Properties.envOrNone("PWD")
res2: Option[String] = Some(/private/tmp)
  • envOrElse(key, default):如果变量存在则返回其值,否则返回默认值。
  • envOrNone(key):返回 Option[String],变量不存在时为 None

⚠️ 这种方式适合需要提供默认值或显式处理缺失情况的场景。

2.3. 使用 Java 的 System.getenv() 方法

由于 Scala 和 Java 具备良好的互操作性,我们也可以直接调用 Java 的 System.getenv() 来获取环境变量:

scala> System.getenv()
res0: java.util.Map[String,String] = {
  JAVA_ARCH=x86_64,
  JAVA_MAIN_CLASS_27606=scala.tools.nsc.MainGenericRunner,
  PWD=/private/tmp
}

scala> System.getenv("PWD")
res1: String = /private/tmp

scala> System.getenv("RANDOM-VAR-FOO")
res2: String = null

⚠️ 注意:Java 的 getenv() 在找不到变量时会返回 null,这在 Scala 中并不推荐使用,因为容易引发空指针异常。建议优先使用 sys.envProperties 提供的方法。

3. 小结

本文介绍了在 Scala 中读取环境变量的几种常见方式:

方法 返回类型 是否安全 推荐程度
sys.env Map[String, String] ✅ 是 ⭐⭐⭐⭐⭐
Properties.envOrElse String ✅ 是 ⭐⭐⭐
Properties.envOrNone Option[String] ✅ 是 ⭐⭐⭐
System.getenv() String / Map ❌ 可能为 null

简单粗暴总结一句:日常开发中优先使用 sys.env,简洁又安全。

如果你在做配置加载、环境隔离相关的工作,这些知识点就是基本功了,踩坑往往都是因为没处理好 null 或默认值 😅。


原始标题:Reactive Flow with MongoDB, Kotlin, and Spring WebFlux