staticなFactoryメソッドを使用するBeanの設定(Spring1.2RC2)
前頁ではBeanFactoryはbeanのコンストラクタによってbeanをインスタンス化した.次にBeanFactoryがbeanのFactoryクラスのstaticなFactoryメソッドによってbeanをインスタンス化するように指定する方法を調査してみた.
前頁に記述されたBeanFacotryのための設定や動作から,BeanFacotryは別にbeanでないクラスのFactoryにもなれることが想像できる.
実際bean以外のクラスに適用してDI(あるいはIoC)を実現するようだ.
「bean以外のクラスでも生成できるなら,どんなクラスでもよいのか」というと,前頁の記述範囲無いだと引数のないコンストラクタを持つクラスならなんでもという答えになる.
さらに本頁では,FactoryクラスとstaticなFactoryメソッドを指定することによって,コード化できるクラスならなんでもBeanFactoryでインスタンス化できる方法について調査し,サンプルを作成してみた.
サンプルの実行方法は,前頁と同じである.
サンプルの設定ファイルを以下にしめす.
ポイントを以下に示す.
- beanの属性class
- 該当beanのFactoryクラスのFQCNを指定する(※).
- beanの属性factory-method
- 上で指定したFactoryクラスのFactoryメソッド名. 指定したFactoryメソッドは上記Factoryクラスのメンバかつ引数なしかつstaticでなければならない.
※ サンプルでは紛らわしいが,HelloBeanFactoryはサンプルドライバで,MyBeanFactoryがFactoryクラスである
Factoryクラスおよびメソッドにより,beanクラスはインスタンス化できるものなら何でもよい.
今回はせっかくなので,コンストラクタに引数を持つように修正した.
beans.xmlで指定したclassはFactoryクラスでFQCNはorg.fireproject.springsample.MyBeanFactoryである.
該当要素beanの属性factory-methodにてcreateHelloBeanを指定したので,これと同名かつstaticな引数なしのFactoryメソッドを作成した.
public static HelloBean createHelloBean() {
logger.info("===== createHelloBean start");
return new HelloBean(Calendar.getInstance().getTime());
}
サンプルのドライバクラスHelloBeanFactoryは前頁と同じである.
実行すると以下のログがでた.
2005-05-07 13:21:09,983 INFO [main] xml.XmlBeanDefinitionReader:132 - Loading XML bean definitions from URL [jar:file:/home/matsu/programing/java/spring/dicontainer2/springsample.jar !/org/fireproject/springsample/beans.xml] 2005-05-07 13:21:10,064 INFO [main] springsample.HelloBeanFactory:32 - ====== get HelloBean by id 2005-05-07 13:21:10,068 INFO [main] support.AbstractBeanFactory:219 - Creating shared instance of singleton bean 'helloid' 2005-05-07 13:21:10,162 INFO [main] springsample.MyBeanFactory:12 - ===== createHelloBean start 2005-05-07 13:21:10,193 INFO [main] springsample.HelloBeanFactory:34 - org.fireproject.springsample.HelloBean [constractDate=1115439670163;messge=Hello Bean!!!!;value=1;] 2005-05-07 13:21:10,194 INFO [main] springsample.HelloBeanFactory:40 - ====== get HelloBean by name 2005-05-07 13:21:10,194 INFO [main] springsample.HelloBeanFactory:42 - org.fireproject.springsample.HelloBean [constractDate=1115439670163;messge=Hello Bean!!!!!!!!!;value=10;] 2005-05-07 13:21:10,195 INFO [main] springsample.HelloBeanFactory:45 - helloBeanById == helloBeanByName ? trueやはりデフォルトではbeanがsingletonとなるので,Factoryメソッドは一度呼ばれるだけで,あとはキャッシュされたインスタンスをBeanFactoryが返しているようだ.

