ConfigSlurper是Groovy操作配置的一个工具类,通过此类你可以像写Groovy脚本一样来写那些属性文件。但跟常规的Java属性文件不同,ConfigSlurper脚本不仅兼容Java类型的写法,而且还支持树状结构的写法。
以下是一个通过ConfigSlurper脚本来配置Log4j的示例:
log4j.appender.stdout = "org.apache.log4j.ConsoleAppender" log4j.appender."stdout.layout"="org.apache.log4j.PatternLayout" log4j.rootLogger="error,stdout" log4j.logger.org.springframework="info,stdout" log4j.additivity.org.springframework=false
为了加载这个可读的配置,你需要:
def config = new ConfigSlurper().parse(new File('myconfig.groovy').toURL()) assert "info,stdout" == config.log4j.logger.org.springframework assert false == config.log4j.additivity.org.springframework
正如上述示例所示,你可以通过点标识符来访问相关配置并且其返回值是Java类型,比如字符串、布尔类型等
你也可以在配置脚本中使用作用域来避免重复信息,因此上述示例也可以这样写:
log4j { appender.stdout = "org.apache.log4j.ConsoleAppender" appender."stdout.layout"="org.apache.log4j.PatternLayout" rootLogger="error,stdout" logger { org.springframework="info,stdout" } additivity { org.springframework=false } }
你可以将ConfigSlurper配置脚本转换成为传统的Java属性文件,比如:
java.util.Properties props = // load from somewhere def config = new ConfigSlurper().parse(props) props = config.toProperties()
如果你有多个配置文件,你可以将这些配置对象合并,并且创建一个核心的配置对象,比如:
def config1 = new ConfigSlurper().parse(..) def config2 = new ConfigSlurper().parse(..) config1 = config1.merge(config2)
你可以将一个配置对象序列化到磁盘上,因为每一个配置对象都实现了groovy.lang.Writable接口,故你可以使用任何java.io.Writer接口来写这些配置,如下:
def config = new ConfigSlurper().parse(..) new File("..").withWriter { writer -> config.writeTo(writer) }
ConfigSlurper除了缺省构造函数以外,还有一个特殊的”environment“参数的构造函数,此构造函数跟属性设置所称谓的”环境(environments)“有关, 这允许在属性文件中有一个缺省的设置,而在适当的环境闭包中又可以替代此设置。有了这个特殊的构造函数,多个相关的配置可以存储在同一个文件中了。
看看如下属性文件:
Sample.groovy sample { foo = "default_foo" bar = "default_bar" } environments { development { sample { foo = "dev_foo" } } test { sample { bar = "test_bar" } } }
以下是特定配置的演示代码:
def config = new ConfigSlurper("development").parse(new File('Sample.groovy').toURL()) assert config.sample.foo == "dev_foo" assert config.sample.bar == "default_bar" config = new ConfigSlurper("test").parse(new File('Sample.groovy').toURL()) assert config.sample.foo == "default_foo" assert config.sample.bar == "test_bar"
注意: 此environments闭包不能直接解析,如果没有指定特定的environment,此闭包将被忽略。