ファイヤープロジェクト
Dependency Injection(Spring1.2RC2)
2005-05-08T00:30+09:00   matsu
もちろん前頁までのサンプルも,設定ファイルに記述した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>
今までは要素propertyの子要素はvalueで,値を直接記述していたが,今回は要素refを使用する. この要素refは空要素である.
サンプルの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
matsu(C)
Since 2002
Mail to matsu