ファイヤープロジェクト
depends-on(Spring1.2)
2005-05-22T22:45+09:00   matsu
要素beanは属性depends-onを指定することで,bean間の依存関係を明示できる.これを使用すると,単純に要素refを使用した場合と,bean生成順序が異なってきて,便利な場合があるかもしれない.
要素beanには属性depends-onがある. これによって,該当beanが依存するbeanを指定することができる. BeanFactoryは該当beanを生成するにあたって,依存しているbeanをまず生成する. 以下に本頁のサンプルのbeans.xmlを示す.
idがtopBeanType1とtopBeanType2であるbeanは,それぞれメンバとしてidがinnerBeanType1,innerBeanType1-2であるbeanをメンバとして初期化するようになっている. idがtopBeanType1とtopBeanType2であるbeanの違いは,後者が要素beanの属性depends-onにて,idがinnerBeanType1-2であるbeanに依存していることを明示している点である. 依存beanを指定することによって,BeanFactoryは,依存beanを生成するにあたり,まず披依存beanを生成するようになる.
サンプルのドライバクラスを以下に示す.
depends-on指定の無いidがidがtopBeanType1のbean,depends-on指定のあるtopBeanType2を順にBeanFactoryから取得する. また,各beanのコンストラクタには,コンストラクタがcallされた旨を示すログ出力をするようにしておいた. ログは以下のようになる.
2005-05-22 22:31:39,683 INFO  [main] xml.XmlBeanDefinitionReader:132
  - Loading XML bean definitions from URL
  [jar:file:/home/matsu/programing/java/spring/dicontainer11/springsample.jar
  !/org/fireproject/springsample/beans.xml]
2005-05-22 22:31:39,783 INFO  [main] support.AbstractBeanFactory:218
  - Creating shared instance of singleton bean 'topBeanType1'
2005-05-22 22:31:39,784 INFO  [main] springsample.TopBeanType1:13
  - org.fireproject.springsample.TopBeanType1 is created.
2005-05-22 22:31:39,898 INFO  [main] support.AbstractBeanFactory:218
  - Creating shared instance of singleton bean 'innerBeanType1'
2005-05-22 22:31:39,903 INFO  [main] springsample.InnerBeanType1:11
  - org.fireproject.springsample.InnerBeanType1 is created.
2005-05-22 22:31:39,914 INFO  [main] springsample.HelloBeanFactory:31
  - ====org.fireproject.springsample.TopBeanType1
  [innerBean=org.fireproject.springsample.InnerBeanType1[]]
2005-05-22 22:31:39,915 INFO  [main] support.AbstractBeanFactory:218
  - Creating shared instance of singleton bean 'topBeanType1-depends-on'
2005-05-22 22:31:39,915 INFO  [main] support.AbstractBeanFactory:218
  - Creating shared instance of singleton bean 'innerBeanType1-2'
2005-05-22 22:31:39,916 INFO  [main] springsample.InnerBeanType1:11
  - org.fireproject.springsample.InnerBeanType1 is created.
2005-05-22 22:31:39,917 INFO  [main] springsample.TopBeanType1:13
  - org.fireproject.springsample.TopBeanType1 is created.
2005-05-22 22:31:39,920 INFO  [main] springsample.HelloBeanFactory:31
  - ====org.fireproject.springsample.TopBeanType1[innerBean=null]
このように,depends-on指定のないtopBeanType1の生成では処理は以下のように流れている.
  1. topBeanType1の生成判定
  2. topBeanType1の生成
  3. innerBeanType1の生成判定
  4. innerBeanType1の生成
innerBeanType1は,topBeanType1のメンバinnerBeanをsetする際に生成される. 逆にdepends-on指定のあるinnerBeanType1-depends-onの生成では,処理は以下のように流れている.
  1. topBeanType1-depends-onの生成判定
  2. innerBeanType1-2の生成判定
  3. innerBeanType1-2の生成
  4. topBeanType1-depends-onの生成
topBeanTyp1-depends-onを生成しようとしたら,依存beanがあるのでまずそちらを生成する,という流れである. このとき,innerBeanType1-2の生成は属性depends-onに基づく処理なので,beands.xmlで仮に
  <bean id="topBeanType1-depends-on"
        class="org.fireproject.springsample.TopBeanType1"
	depends-on="innerBeanType1-2">
  </bean>
と,子要素refを無くしてもinnerBeanType1-2は生成される. depends-onが無ければ,各beanはコードで指定されるか,指定されたbeanにsetする必要があるときに始めて生成されるが,depends-onを指定することにより,アプリケーション起動時に一括して生成するといったことも可能となる.
matsu(C)
Since 2002
Mail to matsu