20. DIコンテナとの連携

プレゼンテーションフレームワークDIコンテナが連携する際に問題になるのは、プレゼンテーションフレームワークで生成しているオブジェクトがDIコンテナで管理できないという部分です。
WebWork2(というかXWork)では、Action,Result,Interceptorなどのインスタンスを生成する部分が、com.opensymphony.xwork.ObjectFactoryというクラスに外出しされており、Actionなどを直に生成せずにDIコンテナから取得させることが出来るため、DIコンテナとの連携が容易になっています。

独自のObjectFactoryの作成

ObjectFactoryを継承してbuildBean()メソッドをオーバーライドし、DIコンテナからオブジェクトを取得する処理を実装します。

public class OriginalObjectFactory extends ObjectFactory {
    public Object buildBean(Class clazz) throws Exception {
        // DIコンテナからオブジェクトを取得する処理
    }

    public Object buildBean(String className) throws Exception {
        // DIコンテナからオブジェクトを取得する処理
    }
}

独自のObjectFactoryの設定方法

ObjectFactory.setObjectFactory()メソッドで独自のObjectFactoryのインスタンスを設定します。
これはxwork.xmlが読み込まれる前に行う必要があります。WebWork2.1.7の場合はServletDispatcherが初期化される時にxwork.xmlの読み込みが行われます。

実装

すでにSpringとSeasar2向けのObjectFactoryは存在します。

おまけ情報

Action,Result,Interceptor以外にもObjectFactoryを使ってインスタンスを生成している部分がいくつかあります。
例えばVelocityContextはObjectFactoryを使って生成しているので、VelocityToolのコンポーネントDIコンテナで設定するなんてことが出来ました。