depends-on(Spring1.2)
要素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の生成では処理は以下のように流れている.
- topBeanType1の生成判定
- topBeanType1の生成
- innerBeanType1の生成判定
- innerBeanType1の生成
- topBeanType1-depends-onの生成判定
- innerBeanType1-2の生成判定
- innerBeanType1-2の生成
- topBeanType1-depends-onの生成
<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を指定することにより,アプリケーション起動時に一括して生成するといったことも可能となる.

