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) } }
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) }