beanのライフサイクル(Spring1.2.1)
beanが生成された時や,beanが破棄された時に実行するフックメソッドを簡単に実装できるようなので,試してみた.
org.springframework.beans.factory.BeanFactoryのJavaDocによると,BeanFactoryの実装は,「標準beanライフサイクル」なるものを,可能な限り実装サポートしなければならない.
初期化メソッドの標準的な呼び出し順序は最大で以下である.
- BeanNameAwareの setBeanNameメソッド
- BeanFactoryAwareの setBeanFactoryメソッド
- ResourceLoaderAwareの setResourceLoaderメソッド(アプリケーションコンテキストで動作しているときのみ)
- ApplicationEventPublisherAwareの setApplicationEventPublisherメソッド(アプリケーションコンテキストで動作しているときのみ)
- MessageSourceAwareの setMessageSourceメソッド(アプリケーションコンテキストで動作しているときのみ)
- ApplicationContextAwareの setApplicationContextメソッド(アプリケーションコンテキストで動作しているときのみ)
- ServletContextAwareの setServletContext(アプリケーションコンテキストで動作しているときのみ)
- BeanPostProcessorの postProcessBeforeInitializationメソッド
- InitializingBeanの afterPropertiesSetメソッド
- beans.xmlの要素beanの属性init-methodで指定したメソッド呼び出し
- BeanPostProcessorsの postProcessAfterInitializationメソッド
- DisposableBeanの destroyメソッド
- beans.xmlの要素beanの属性destroy-methodで指定したメソッド呼び出し
- 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によって
- afterPropertiesSet
- initMethod
- destroy
- destroyMethod

