groovy-seasarの文法

コンテナーの定義

SeasarBuilderクラスをインスタンス化し、 SeasarBuilder#container()メソッドを呼ぶことでS2Containerが作成されます。

container = new SeasarBuilder().container{
}

コンテナーで名前空間を利用したい場合は下記のようにcontainer()メソッドの引数に名前を渡します。

builder = new SeasarBuilder()
c1 = builder.container("c1"){
    component(obj:o1, name:"obj")
}
c2 = builder.container("c2"){
    component(obj:o2, name:"obj")
}

コンポーネントの定義

S2コンテナーにコンポーネントを登録するには containerメソッドに渡されるクロージャのなかでcomponentメソッドを呼びます。

コンポーネントを登録する一番簡単な方法はクラスをcomponentメソッドの引数として渡す方法です。

container = new SeasarBuilder().container{
    component(Class)
}

componentメソッドに名前付きのパラメータを渡すことで、 さまざまなオプションを定義することができます。

container = new SeasarBuilder().container{
    component(java.util.ArrayList)
    component(class:java.util.HashMap, name:"aaa")
    component(class:Integer, name:"bbb") {
        arg{
            component(String) {
                arg('1')
            }
        }
    }
    component(class:LifeCycleBean, init:"init", destroy:"destroy")
    component(class:Integer, name:"ccc", instance:"prototype") {
        arg(1)
    }
    component(class:String, name:"ddd", binding:"none")
}

各パラメータの意味は下記の通りです。

パラメータ名意味
class登録するクラス
obj登録するインスタンス
name登録名
initコンテナー開始時に実行されるメソッド
destroyコンテナー終了時に実行されるメソッド
instanceインスタンス管理
binding自動バインディング方法

コンポーネントのコンストラクタに対して、 引数を渡したい場合はcomponentメソッドのクロージャ内でargメソッドを呼びだしてください。 argメソッドはrefという名前付きパラメータとともに呼び出すことで、 既にコンテナーに登録されているコンポーネントの参照を引数として利用することができます。

component(class:Integer, name:"integer1") {
    arg(1)
}
component(class:String, name:"one"){
    arg("1")
}
component(class:Integer, name:"integer2") {
    arg(ref:"one")
}

プロパティを利用した値の設定

コンポーネントに対して、プロパティを利用して値を設定することができます。 componentメソッドのクロージャのなかでpropメソッドを呼びだします。

直接、値を設定する場合は名前付きパラメータのvalueで指定します。

component(java.util.Date) {
    prop(name:"time", value:0)
}

既にコンテナーに登録されたコンポーネントを参照することもできます。 refパラメータにコンポーネント名を渡します。

component(class:Integer, name:"zero") {
    arg(0)
}
component(class:java.util.Date) {
    prop(name:"time", ref:"zero")
}

名前付きパラメータの意味は次の通りです。 valueとrefとは排他的な関係で、どちらか一方の指定が必要です。

パラメータ名意味
nameプロパティ名
value
ref参照名

メソッドを利用した値の設定

S2コンテナーではコンポーネントに対して、プロパティばかりではなく、 メソッドを利用して値を設定することができます。 componentのクロージャ内でmethodメソッドを呼び出してください。

methodメソッドは呼ばれるメソッドの名前を指定する引数をひとつとり、 そのクロージャ内でargメソッドを呼ぶことによって、呼ばれるメソッドの引数を指定できます。

component(java.util.HashMap) {
    method("put") {
        arg('aaa'); arg(111)
    }
}

AOPの適用

componentメソッドのクロージャ内で、aspectメソッドを呼ぶことによって、 componentに対してアドバイスを適用することができます。 aspectメソッドは名前付きパラメータをとり、適用するアドバイスとポイントカットとを指定できます。

パラメータ名意味
adviceアドバイス名
pointcutポイントカット
container = new SeasarBuilder().container{
    component(class:TraceAdvice, name:"traceAdvice")
    component(java.util.Date) {
        arg(0)
        aspect(pointcut:"getTime, hashCode", advice:"traceAdvice")
    }
    component(java.util.ArrayList) {
        aspect(advice:"traceAdvice")
    }
}

アドバイスをクロージャを利用して、直接記述することができます。 クロージャの引数としてJoinPointが渡されますので、そこにアドバイスをGroovyで書くことができます。 クロージャの戻り値がそのAroundAdviceの戻り値となりますので、 もし、意味のある値を返したい場合は、その値を返す必要があります。

component(AspectTarget){
    closure = {joinpoint|
        println "before run"
        joinpoint.proceed()
        println "after run"
    }
    aspect(pointcut:"run", advice:closure)
}