Play 使用 Typesafe config library,但是Play提供了优雅的包装类 Configuration
,支持更多Scala高级特性。 如果你对Typesafe配置不是很熟悉,可以先阅读这篇文章configuration file syntax and features。
通常,你可以通过依赖注入(Dependency Injection)获得Configuration
对象,或者简单的在组件间传递Configuration
实例。
class MyController @Inject()(config: Configuration, c: ControllerComponents) extends AbstractController(c) {
def getFoo = Action {
Ok(config.get[String]("foo"))
}
}
get
方法是最常用的,用来获取配置文件中单个配置值。
// foo = bar
config.get[String]("foo")
// bar = 8
config.get[Int]("bar")
// baz = true
config.get[Boolean]("baz")
// listOfFoos = ["bar", "baz"]
config.get[Seq[String]]("listOfFoos")
get
方法有一个隐式参数ConfigLoader
,但是对于最常见的类型String
、 Int
,甚至于Seq[String]
, 已经提供了定义好的对应的加载器.
Configuration
还支持验证一组有效值。
config.getAndValidate[String]("foo", Set("bar", "baz"))
通过自定义ConfigLoader
,可以很轻松地将配置转换为自定义类型。
这在Play内部广泛使用,可以为配置使用提供更多的类型安全特性。例如:
case class AppConfig(title: String, baseUri: URI)
object AppConfig {
implicit val configLoader: ConfigLoader[AppConfig] = new ConfigLoader[AppConfig] {
def load(rootConfig: Config, path: String): AppConfig = {
val config = rootConfig.getConfig(path)
AppConfig(
title = config.getString("title"),
baseUri = new URI(config.getString("baseUri"))
)
}
}
}
然后可以像上面那样使用config.get
:
// app.config = {
// title = "My App
// baseUri = "https://example.com/"
// }
config.get[AppConfig]("app.config")
Play的Cofiguration
支持获取可选的配置键,通过使用getOptional[A]
方法。和get[A]
类似,但是如果键名不存在会返回None
。我们建议您不要使用此方法,而是在配置文件中将可选键设置为null
并使用get [Option [A]]
。但是,为了方便您需要与以非标准方式使用配置信息,我们提供此方法。