Spring Framework 入門記 Beanその7 ライフサイクル(リフレクション編)

引き続きライフサイクルです.
ごくごく普通のBeanやPOJOを組み合わせてアプリケーションを構築するとなると,その中にはSpringのことなんか知らないクラスもたくさん出てくるでしょう.あるいは,Springに依存したくないと考えることもあるでしょう.ですから,Springが提供するInitializingBeanDisposableBeanimplementsすることができなかったり適当でなかったりする場合が多々あると考えられます.しかし,それでも初期化や後片付けのタイミングは必要だったりします.
そんな時に便利なように,Springのコンテナが指定した任意のメソッド(とはいっても制限はありますが)を呼び出してくれるように設定することが出来ます.
初期化のタイミング(プロパティの設定後)で呼び出してほしいメソッドがあれば,それを<bean>要素のinit-method属性で指定します.ただし,呼び出せるのは引数のないメソッドだけです.戻り値はあってもなくても構いません.
同様に,singletonの場合に破棄のタイミングで呼び出してほしいメソッドがあれば,それを<bean>要素のdestroy-method属性で指定します.
例によって実験コーナー.
まずは簡単なクラスを作成.

package study;

public class Bar {
    protected String text;
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public void initialize() {
        System.out.println("initialized.");
    }
    public void dispose() {
        System.out.println("disposed.");
    }
}

次に定義ファイル(<bean>要素だけ抜粋).

    <bean id="bar" class="study.Bar" init-method="initialize" destroy-method="dispose">
        <property name="text"><value>Bar</value></property>
    </bean>

そして実行!

 - Loading XML bean definitions from (no description)
 - Creating shared instance of singleton bean 'bar'
initialized.
bar : study.Bar@19ce060
    text=Bar
    class=class study.Bar
disposed.

ばっちり!
init-method属性およびdestroy-method属性を使うと,BeanをSpringに依存させずに済みます.しかし,その場合はBeanのインスタンスの定義ごと*1init-method属性やdestroy-method属性を指定しなければなりません.ちょっと間違いやすいような気がします.インタフェースを実装しておけば,確実にコンテナがそのメソッドを呼び出してくれるのですから,その方が安心なんですけどね.どちらがいいのか,悩みどころです.

*1:prototypeの場合は雛形(?)ごと.