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