Dependency Injection(Spring1.2RC2)
もちろん前頁までのサンプルも,設定ファイルに記述したbeanをプログラムにInjectしていた(プログラム本体のbeanへのDependency Injection).本頁ではさらに設定ファイル内の複数のbean間のDependency Injectionを試してみる.
本頁のサンプルのbeans.xml内の登場クラスのクラス図を以下に示す.
サンプルでは上記4つの具象クラスを定義している.
TopBeanの具象クラスはメンバにInnerBeanのオブジェクトを持つ.
InnerBeanが実際にはInnerBernType1かInnerBeanType2かはbeans.xmlにて定義する.
beans.xmlを以下に示す.
beans.xmlでは二種類のDependency Injectionがある.
- プログラムと要素beanとの間(プログラムとbeans.xml間)
- これは前頁までのサンプルに登場したパターンである. 要素beanの属性id(あるいはnameやalias)によって紐づけている.
- 要素bean間(beanx.xml内)
- やはり要素beanの属性idによって紐づけている.
- 要素propertyの子要素ref
- 該当beanのメンバが他の要素beanで表されるbeanである場合,まず要素propertyの属性nameでメンバ名を指定する.
そして要素propertyの子要素refの属性beanにて,メンバのbeanを定義している要素beanの属性idを指定する.
<property name="innerBean"><ref bean="innerBeanType1"/></property>
サンプルの4つの具象クラスは,メンバtopValueあるいはinnverValueをsetした際の処理が,クラス名にType1があるかType2があるかによって異なる.
Type1の場合はそのままsetし,Type2の場合は-1を掛けてからsetする.
サンプルbeans.xmlでは,これらを以下のように組み合わせた.
TopBeanを具象クラス,包含するInnerBeanの具象クラスに応じて三つ定義した.
サンプルドライバではこれを呼び出し,beans.xmlにて依存性をうまく設定できることを確認する.
サンプルのドライバクラスHelloBeanFactoryを以下に示す.
実行すると以下のログがでた.
2005-05-08 00:26:51,406 INFO [main] xml.XmlBeanDefinitionReader:132 - Loading XML bean definitions from URL [jar:file:/home/matsu/programing/java/spring/dicontainer6/springsample.jar! /org/fireproject/springsample/beans.xml] 2005-05-08 00:26:51,506 INFO [main] support.AbstractBeanFactory:219 - Creating shared instance of singleton bean 'topBeanType1-1' 2005-05-08 00:26:51,616 INFO [main] support.AbstractBeanFactory:219 - Creating shared instance of singleton bean 'innerBeanType1' 2005-05-08 00:26:51,644 INFO [main] springsample.HelloBeanFactory:32 - ====org.fireproject.springsample.TopBeanType1 [topValue=1.5;innerBean=org.fireproject.springsample.InnerBeanType1[innerValue=10;]] 2005-05-08 00:26:51,645 INFO [main] support.AbstractBeanFactory:219 - Creating shared instance of singleton bean 'topBeanType1-2' 2005-05-08 00:26:51,646 INFO [main] support.AbstractBeanFactory:219 - Creating shared instance of singleton bean 'innerBeanType2' 2005-05-08 00:26:51,658 INFO [main] springsample.HelloBeanFactory:32 - ====org.fireproject.springsample.TopBeanType1 [topValue=1.5;innerBean=org.fireproject.springsample.InnerBeanType2[innerValue=-20;]] 2005-05-08 00:26:51,658 INFO [main] support.AbstractBeanFactory:219 - Creating shared instance of singleton bean 'topBeanType2' 2005-05-08 00:26:51,670 INFO [main] springsample.HelloBeanFactory:32 - ====org.fireproject.springsample.TopBeanType2 [topValue=-1.7;innerBean=org.fireproject.springsample.InnerBeanType2[innerValue=-20;]]topValue,innerValueの値から(正か負か),以下のような指定idと実際の具象クラスが確認できる.
- topBeanType1-1を指定した場合
- TopBeanType1とTopBeanType1
- topBeanType1-2を指定した場合
- TopBeanType1とTopBeanType2
- topBeanType2を指定した場合
- TopBeanType2とTopBeanType2

