ushidayの日記

主に「IBMi」のメモに・・・

SpringBeanBuilderのお勉強で...その2

g*workshop第3回に行って来ました。
zkプラグインのお話や、今ホットな話題のGAE/Jのお話など盛りだくさんでした。
早くその話題にスムーズについていけるように、ならなきゃだけど、いつの日やら...orz

さて本題で、只今、Grails徹底入門のプラグイン10章を勉強中です。
doWithSpringクロージャーのお話から、"Spring BeanBuiler"を単独で動かすとう内容に移り、そもそもSpring Frameworkを知らない、自分の理解が全くもって悪いので、メモしときます。

Spring Beanbuilderでビーンを参照する際に、”プロパティ=ref("参照ビーンID",true)”の様に、第二引数に”true”を入れると、「親のApplicationContext内のみを参照」との事、以下の様なテスト用のビーンを2つ用意します。

  • BeanA
class BeanA{
	String name 
}
  • BeanB
class BeanB{
	String name 
	BeanA parent
}

groovyスクリプトで、以下のように、"true"を付けずに、Spring BeanBuilderを使っても、出来てしまったので、”true”は何のために有るのだろ?みたいなお馬鹿な事を思ってしまったのです。今思えば、ちゃんと本の文章を読めって事なんですが...o(x_x=。

  • SpringBuilderWithParent
import org.springframework.context.ApplicationContext
import grails.spring.BeanBuilder

// 親の生成
def builder = new BeanBuilder()
builder.beans{
	beanA(BeanA){
		name = "BeanA Parent"
	}
}
//子の生成
def builder2 = new BeanBuilder(builder.createApplicationContext())
builder2.beans{
	beanB(BeanB){
		name = "BeanB Chiled1"
		parent = ref("beanA")     //親のビーン参照
	}
}

def ctx = builder2.createApplicationContext()
assert ctx.beanB.parent.name == "BeanA Parent"

お馬鹿な頭で悩むこと数分、”親のみ”という言葉を思い出して、子自身の”ApplicationContext”に、同名のビーン定義が、あった場合でも、子の参照を回避して親から参照出来るという事?...。聞く相手もいないので、やってみました。

import org.springframework.context.ApplicationContext
import grails.spring.BeanBuilder

// 親の生成
def builder = new BeanBuilder()
builder.beans{
	beanA(BeanA){
		name = "BeanA Parent"
	}
}
//子の生成
def builder2 = new BeanBuilder(builder.createApplicationContext())
builder2.beans{
	beanA(BeanA){
		name = "BeanA Chiled"
	}

	beanB(BeanB){
		name = "BeanB Chiled1"
		parent = ref("beanA",true)     //親のビーン参照
	}
}

def ctx = builder2.createApplicationContext()
assert ctx.beanB.parent.name == "BeanA Parent"

”true”が無いと...

//------------------- 省 略 -------------------------------------
	beanB(BeanB){
		name = "BeanB Chiled1"
		parent = ref("beanA")     //子のビーン参照
	}
}
def ctx = builder2.createApplicationContext()
assert ctx.beanB.parent.name == "BeanA Chiled"

なるほど、動きは理解をしたけど、こういった機能を理解した上で、どんな場面で使えるかが重要なんでしょうね。
ちなみに同一IDのビーンを1つのbuilderの中で、複数回定義したら、エラーにはならず、最後に定義したビーンを参照しました。

//------------------- 省 略 -------------------------------------
def builder2 = new BeanBuilder(builder.createApplicationContext())
builder2.beans{

	beanA(BeanA){
		name = "BeanA Chiled1"
	}
        //同名ビーン
	beanA(BeanA){
		name = "BeanA Chiled2"
	}

	beanB(BeanB){
		name = "BeanB Chiled1"
		parent = ref("beanA")     //ビーン参照
	}
}
def ctx = builder2.createApplicationContext()
assert ctx.beanB.parent.name == "BeanA Chiled2"


”true”をつけた場合に、親のApplicationContextに指定されたビーンIDがなければ、子のApplicationContextに同名があってもちゃんとエラーになりました。あたりまえですね。
でも、一人でやってると、こういう理解で正しいのかが、心配(゚Д゚;)です。