ファイヤープロジェクト
beanのライフサイクル(Spring1.2.1)
2005-06-14T23:20+09:00   matsu
beanが生成された時や,beanが破棄された時に実行するフックメソッドを簡単に実装できるようなので,試してみた.
org.springframework.beans.factory.BeanFactoryのJavaDocによると,BeanFactoryの実装は,「標準beanライフサイクル」なるものを,可能な限り実装サポートしなければならない. 初期化メソッドの標準的な呼び出し順序は最大で以下である.
  1. BeanNameAwareの setBeanNameメソッド
  2. BeanFactoryAwareの setBeanFactoryメソッド
  3. ResourceLoaderAwareの setResourceLoaderメソッド(アプリケーションコンテキストで動作しているときのみ)
  4. ApplicationEventPublisherAwareの setApplicationEventPublisherメソッド(アプリケーションコンテキストで動作しているときのみ)
  5. MessageSourceAwareの setMessageSourceメソッド(アプリケーションコンテキストで動作しているときのみ)
  6. ApplicationContextAwareの setApplicationContextメソッド(アプリケーションコンテキストで動作しているときのみ)
  7. ServletContextAwareの setServletContext(アプリケーションコンテキストで動作しているときのみ)
  8. BeanPostProcessorの postProcessBeforeInitializationメソッド
  9. InitializingBeanの afterPropertiesSetメソッド
  10. beans.xmlの要素beanの属性init-methodで指定したメソッド呼び出し
  11. BeanPostProcessorsの postProcessAfterInitializationメソッド
終了メソッドの呼び出し順序は以下である.
  1. DisposableBeanの destroyメソッド
  2. beans.xmlの要素beanの属性destroy-methodで指定したメソッド呼び出し
これらのメソッドは,インタフェースを実装するか,beanを設定することによって,beanの生成廃棄する際にBeanFactoryによって自動的に呼ばれるはずである. 本頁ではこれらのうち,以下を試してみる.
  • InitializingBeanの afterPropertiesSetメソッド
  • beans.xmlの要素beanの属性init-methodで指定したメソッド呼び出し
  • DisposableBeanの destroyメソッド
  • beans.xmlの要素beanの属性destroy-methodで指定したメソッド呼び出し
以下に本頁のサンプルのbeans.xmlを示す.
id値lifeCycleSampleBeanであるbeanの,任意属性属性init-method,destroy-methodにメソッド名を指定することによって,beanの生成時,廃棄時に指定した名前のメソッドが自動的に呼び出される. 当然beanでは,上記属性で指定した名前のメソッドを実装する必要がある. サンプルのLifeCycleSampleBeanでもinitMethod,destroyMethodを実装している.
また,LifeCycleSampleBeanは,さらに二つインタフェースInitializingBeanとDisposableBeanのメソッドafterPropertiesSetとdestoryを実装している. これらのインタフェースを実装することによって,やはりbeanの生成時,廃棄時にそれぞれのインタフェースのメソッドが自動的に呼び出される. サンプルのドライバを以下に示す.
このように,単にLifeCycleSampleBeanを生成,破棄することで,以上の4つのメソッドが順に呼ばれる. 注意点は,今までのサンプルで使用していたXmlBeanFactoryでは,beanの廃棄処理がないことである. これでは終了シーケンスが始まらないまま,プログラムが終了してしまう. そこで,今回はGenericApplicationContextを使用して,プログラムの終了シーケンスのキックをかけた. 実行ログを以下に示す.
$> java -jar springsample.jar 
...省略...
2005-06-14 23:06:19,663 INFO  [main] support.AbstractBeanFactory:219
 - Creating shared instance of singleton bean 'lifeCycleSampleBean'
2005-06-14 23:06:19,665 INFO  [main] springsample.LifeCycleSampleBean:17
 - constructor of LifeCycleSampleBean.
2005-06-14 23:06:19,747 INFO  [main] springsample.LifeCycleSampleBean:21
 - setValue.
2005-06-14 23:06:19,750 INFO  [main] springsample.LifeCycleSampleBean:35
 - afterPropertiesSet.
2005-06-14 23:06:19,754 INFO  [main] springsample.LifeCycleSampleBean:43
 - initMethod.
2005-06-14 23:06:19,757 INFO  [main] springsample.HelloBeanFactory:37
 - factory.close.
2005-06-14 23:06:19,758 INFO  [main] support.AbstractApplicationContext:499
 - Closing application context
 [org.springframework.context.support.GenericApplicationContext;hashCode=19058102]
2005-06-14 23:06:19,759 INFO  [main] support.AbstractBeanFactory:525
 - Destroying singletons in factory
 {org.springframework.beans.factory.xml.XmlBeanFactory defining beans
 [lifeCycleSampleBean]; root of BeanFactory hierarchy}
2005-06-14 23:06:19,759 INFO  [main] springsample.LifeCycleSampleBean:51
 - destroy.
2005-06-14 23:06:19,760 INFO  [main] springsample.LifeCycleSampleBean:59
 - destroyMethod.
確かに,サンプルドライバでは明示的に呼び出していないにも係わらず,BeanFactoryによって
  1. afterPropertiesSet
  2. initMethod
  3. destroy
  4. destroyMethod
と,標準的な順序で呼び出されている.
matsu(C)
Since 2002
Mail to matsu