Singleton(Spring1.2RC2)
今までのサンプルでも記述してきたが,特に指定しない場合,BeanFactoryが作成するbeanはSingletonとなる.本頁ではSingletonと,そうでない場合の指定方法とその動作を確認する.
本頁のサンプルでは,同一のクラスのbeanをbeans.xmlにて二つ定義する.
一方はsingleton指定,もう一方は非singleton指定である.
beans.xmlを以下に示す.
ポイントは以下.
- 要素beanの属性singleton
- 該当beanがsingletonの場合はtrue,非singletonの場合はfalse. 指定しない場合はtrueが設定された場合と同様に動作する(すなわちsingleton).
サンプルのドライバクラスHelloBeanFactoryを以下に示す.
BeanFactoryからsingleton,非singletonをそれぞれ二回ずつ取得して(idはそれぞれsingleton-helloid,not-ingleton-helloid),総あたりで同一インスタンスか否かをチェックしている.
実行すると以下のログがでた.
2005-05-07 23:55:23,769 INFO [main] xml.XmlBeanDefinitionReader:132 - Loading XML bean definitions from URL [jar:file:/home/matsu/programing/java/spring/dicontainer5/springsample.jar !/org/fireproject/springsample/beans.xml] 2005-05-07 23:55:23,856 INFO [main] springsample.HelloBeanFactory:27 - ====== get HelloBean by singleton-helloid 2005-05-07 23:55:23,861 INFO [main] support.AbstractBeanFactory:219 - Creating shared instance of singleton bean 'singleton-helloid' 2005-05-07 23:55:23,862 INFO [main] support.AbstractBeanFactory:219 - Creating shared instance of singleton bean 'myBeanFactory' 2005-05-07 23:55:23,985 INFO [main] springsample.MyBeanFactory:14 - ===== createHelloBean start 2005-05-07 23:55:23,996 INFO [main] springsample.MyBeanFactory:14 - ===== createHelloBean start 2005-05-07 23:55:23,998 INFO [main] springsample.MyBeanFactory:14 - ===== createHelloBean start 2005-05-07 23:55:23,999 INFO [main] springsample.HelloBeanFactory:33 - org.fireproject.springsample.HelloBean [constractDate=1115477723987;factoryName=myBeanFactory1;messge=Hello Bean!!!!;value=1;] 2005-05-07 23:55:24,000 INFO [main] springsample.HelloBeanFactory:35 - i = 0 / j = 1 / sameobject? = true 2005-05-07 23:55:24,000 INFO [main] springsample.HelloBeanFactory:35 - i = 0 / j = 2 / sameobject? = false 2005-05-07 23:55:24,001 INFO [main] springsample.HelloBeanFactory:35 - i = 0 / j = 3 / sameobject? = false 2005-05-07 23:55:24,001 INFO [main] springsample.HelloBeanFactory:33 - org.fireproject.springsample.HelloBean [constractDate=1115477723987;factoryName=myBeanFactory1;messge=Hello Bean!!!!;value=1;] 2005-05-07 23:55:24,001 INFO [main] springsample.HelloBeanFactory:35 - i = 1 / j = 2 / sameobject? = false 2005-05-07 23:55:24,002 INFO [main] springsample.HelloBeanFactory:35 - i = 1 / j = 3 / sameobject? = false 2005-05-07 23:55:24,002 INFO [main] springsample.HelloBeanFactory:33 - org.fireproject.springsample.HelloBean [constractDate=1115477723997;factoryName=myBeanFactory1;messge=Hello Bean!!!!;value=1;] 2005-05-07 23:55:24,002 INFO [main] springsample.HelloBeanFactory:35 - i = 2 / j = 3 / sameobject? = false 2005-05-07 23:55:24,003 INFO [main] springsample.HelloBeanFactory:33 - org.fireproject.springsample.HelloBean [constractDate=1115477723999;factoryName=myBeanFactory1;messge=Hello Bean!!!!;value=1;]ログから,singletonの場合は一回しかFactoryメソッドが呼ばれないこと,非singletonの場合は毎回Factoryメソッドが呼ばれていることがわかる. さらにsingleton同士は==でtrue,それ以外はfalseとなっていることが分かる.

