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に同名があってもちゃんとエラーになりました。あたりまえですね。
でも、一人でやってると、こういう理解で正しいのかが、心配(゚Д゚;)です。