Groovy學(xué)習(xí)之-Groovy Development Kit(GDK)-實用工具

Groovy學(xué)習(xí)目錄-傳送門

ConfigSlurper

ConfigSlurper是一個用于讀取以Groovy腳本形式定義的配置文件的實用程序類碟刺。 類似于Java * .properties文件的情況,ConfigSlurper允許使用點符號。 但此外,它允許Closure作用域配置值和任意對象類型珊擂。

def config = new ConfigSlurper().parse('''
    app.date = new Date()  //點符號的用法
    app.age  = 42
    app {                  //使用Closure作用域作為點符號的替代
        name = "Test${42}"
    }
''')

assert config.app.date instanceof Date
assert config.app.age == 42
assert config.app.name == 'Test42'

從上面的例子可以看出唧垦,parse方法可以用來檢索groovy.util.ConfigObject實例撒桨。ConfigObject是一個專門的java.util.Map實現(xiàn),它返回配置的值或一個新的ConfigObject實例墨坚,但永遠不為null秧饮。

def config = new ConfigSlurper().parse('''
    app.date = new Date()
    app.age  = 42
    app.name = "Test${42}"
''')

assert config.test != null//`config.test`還沒有被指定,它被調(diào)用時返回一個`ConfigObject`。

點符號是配置變量名稱的一部分的情況下浦楣,可以使用單引號或雙引號對其進行轉(zhuǎn)義袖肥。

def config = new ConfigSlurper().parse('''
    app."person.age"  = 42
''')

assert config.app."person.age" == 42

此外,ConfigSlurper還支持environments振劳。 environments方法可以用來移交一個本身可能由幾個部分組成的Closure實例椎组。 假設(shè)我們想為開發(fā)環(huán)境創(chuàng)建一個特定的配置值。 當(dāng)創(chuàng)建ConfigSlurper實例時历恐,我們可以使用ConfigSlurper(String)構(gòu)造函數(shù)來指定目標環(huán)境寸癌。

def config = new ConfigSlurper('development').parse('''
  environments {
       development {
           app.port = 8080
       }

       test {
           app.port = 8082
       }

       production {
           app.port = 80
       }
  }
''')

assert config.app.port == 8080

ConfigSlurper環(huán)境不限于任何特定的環(huán)境名稱。 它只依賴于ConfigSlurper客戶端代碼支持和解釋什么值弱贼。

environments方法是內(nèi)置的蒸苇,但registerConditionalBlock方法可用于注冊除environments名稱之外的其他方法名稱。

def slurper = new ConfigSlurper()
slurper.registerConditionalBlock('myProject', 'developers')   //一旦新block被注冊吮旅,ConfigSlurper可以解析它溪烤。

def config = slurper.parse('''
  sendMail = true

  myProject {
       developers {
           sendMail = false
       }
  }
''')

assert !config.sendMail

對于Java集成,toProperties方法可用于將ConfigObject轉(zhuǎn)換為可能存儲到* .properties文本文件的java.util.Properties對象庇勃。 請注意檬嘀,將配置值添加到新創(chuàng)建的Properties實例時,將其轉(zhuǎn)換為String實例责嚷。

def config = new ConfigSlurper().parse('''
    app.date = new Date()
    app.age  = 42
    app {
        name = "Test${42}"
    }
''')

def properties = config.toProperties()

assert properties."app.date" instanceof String
assert properties."app.age" == '42'
assert properties."app.name" == 'Test42'

Expando

Expando類可用于創(chuàng)建動態(tài)可擴展對象鸳兽。 盡管它的名稱叫Expando罕拂,它不使用類ExpandoMetaClass衷掷。 每個Expando對象表示一個獨立的動態(tài)制作的實例棍鳖,可以在運行時使用屬性(或方法)進行擴展。

def expando = new Expando()
expando.name = 'John'

assert expando.name == 'John'

當(dāng)動態(tài)屬性注冊Closure代碼塊時,會發(fā)生特殊情況醇份。 一旦Closure被注冊僚纷,它就可以被調(diào)用怖竭,因為它將通過方法調(diào)用完成哮肚。

def expando = new Expando()
expando.toString = { -> 'John' }
expando.say = { String s -> "John says: ${s}" }

assert expando as String == 'John'
assert expando.say('Hi') == 'John says: Hi'

可觀察的 list, map and set

Groovy帶有可觀察的 list, map and set鸦致。 當(dāng)添加分唾,刪除或更改元素時,每個集合都會觸發(fā)java.beans.PropertyChangeEvent事件。 注意,PropertyChangeEvent不僅發(fā)出某個事件已經(jīng)發(fā)生的信號睹逃,此外,它保存關(guān)于屬性名稱和某個屬性已經(jīng)改變到的舊/新值的信息。

根據(jù)發(fā)生的更改的類型猎荠,可觀察的集合可能觸發(fā)更專門的PropertyChangeEvent類型荒叶。 例如些楣,向可觀察列表中添加元素會觸發(fā)ObservableList.ElementAddedEvent事件。

def event                                       //聲明一個PropertyChangeEventListener捕獲被觸發(fā)的事件
def listener = {
    if (it instanceof ObservableList.ElementEvent)  {  //ObservableList.ElementEvent及其子類型與此偵聽器相關(guān)
        event = it
    }
} as PropertyChangeListener


def observable = [1, 2, 3] as ObservableList    //注冊監(jiān)聽器
observable.addPropertyChangeListener(listener)  //從給定列表創(chuàng)建一個ObservableList

observable.add 42                               //觸發(fā)ObservableList.ElementAddedEvent事件

assert event instanceof ObservableList.ElementAddedEvent

def elementAddedEvent = event as ObservableList.ElementAddedEvent
assert elementAddedEvent.changeType == ObservableList.ChangeType.ADDED
assert elementAddedEvent.index == 3
assert elementAddedEvent.oldValue == null
assert elementAddedEvent.newValue == 42

請注意,添加元素實際上會觸發(fā)兩個事件。 第一個是類型 ObservableList.ElementAddedEvent,第二個是一個普通的PropertyChangeEvent,通知監(jiān)聽器屬性size的更改。

ObservableList.ElementClearedEvent事件類型是另一個有趣的事件類型秫筏。 每當(dāng)刪除多個元素時田轧,例如調(diào)用clear()時巷查,它保存從列表中刪除的元素有序。

def event
def listener = {
    if (it instanceof ObservableList.ElementEvent)  {
        event = it
    }
} as PropertyChangeListener


def observable = [1, 2, 3] as ObservableList
observable.addPropertyChangeListener(listener)

observable.clear()

assert event instanceof ObservableList.ElementClearedEvent

def elementClearedEvent = event as ObservableList.ElementClearedEvent
assert elementClearedEvent.values == [1, 2, 3]
assert observable.size() == 0

為了獲得所有支持的事件類型的概述,我們鼓勵讀者查看JavaDoc文檔或正在使用的observable集合的源代碼岛请。

ObservableMapObservableSet帶有我們在本節(jié)中對ObservableList所看到的相同的概念旭寿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市崇败,隨后出現(xiàn)的幾起案子盅称,更是在濱河造成了極大的恐慌,老刑警劉巖后室,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缩膝,死亡現(xiàn)場離奇詭異,居然都是意外死亡岸霹,警方通過查閱死者的電腦和手機疾层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贡避,“玉大人痛黎,你說我怎么就攤上這事」伟桑” “怎么了湖饱?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杀捻。 經(jīng)常有香客問我井厌,道長,這世上最難降的妖魔是什么致讥? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任仅仆,我火速辦了婚禮,結(jié)果婚禮上拄踪,老公的妹妹穿的比我還像新娘。我一直安慰自己拳魁,他們只是感情好惶桐,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著潘懊,像睡著了一般姚糊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上授舟,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天救恨,我揣著相機與錄音,去河邊找鬼释树。 笑死肠槽,一個胖子當(dāng)著我的面吹牛擎淤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秸仙,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼嘴拢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寂纪?” 一聲冷哼從身側(cè)響起席吴,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捞蛋,沒想到半個月后孝冒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拟杉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年庄涡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捣域。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡啼染,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焕梅,到底是詐尸還是另有隱情迹鹅,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布贞言,位于F島的核電站斜棚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏该窗。R本人自食惡果不足惜弟蚀,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酗失。 院中可真熱鬧义钉,春花似錦、人聲如沸规肴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拖刃。三九已至删壮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兑牡,已是汗流浹背央碟。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留均函,地道東北人亿虽。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓菱涤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親经柴。 傳聞我的和親對象是個殘疾皇子狸窘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)坯认,斷路器翻擒,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • 導(dǎo)語: 隨著技術(shù)的發(fā)展,不管是前端開發(fā)牛哺、服務(wù)端開發(fā)或者是移動端開發(fā)(移動也是前端的一個分支)中都會用到自動化構(gòu)建工...
    伊始雨深閱讀 3,022評論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法陋气,類相關(guān)的語法,內(nèi)部類的語法引润,繼承相關(guān)的語法巩趁,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 1. 簡介 1.1 什么是 MyBatis 淳附? MyBatis 是支持定制化 SQL议慰、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,455評論 0 4