Struts2.1とSpring2.5の連携

実際のWebアプリケーション開発では、MVC2モデルのVC部分をStruts2.1が制御し、Model部分のビジネスコンポーネントはSpringFrameworkなどのDI(Dependency Injection: 依存性の注入)コンテナが、RDBへのアクセスをおこなうコンポーネントはHibernateなどのORMapper(テーブルにアクセスするフレームワーク)が制御することになります。従来、これらのフレームワークの組合わせは、管理すべき定義ファイルが大きく多くなることから、XML地獄などと揶揄されることもありました。

しかし、Struts2.1と同様にSpringFrameworkやHibernateも最新のバージョンでは、定義ファイルを極力減らせるようになっていますので、上手く利用すればXML地獄に落ち込まずに済みます。

本項では、定義ファイルを極力書かないStruts2.1とSpring2.5の連携方法を解説します。

Struts2.1には、Springと連携するためのプラグイン(struts2-spring-plugin-2.1.6.jar)が用意されています。このプラグインを利用することでアクションクラスはSpringのインジェクション機能を利用することができるようになります。

Struts1系では、SpringFrameworkの管理するビジネスコンポーネントをアクションクラスから利用するためにはActionSupportクラスを継承したり、リクエストプロセッサであるAutowiringRequestProcessorを置き換えたり、Strutsの定義ファイルとSpringFrameworkの定義ファイルを紐づけるなど様々な作業が必要でしたが、Struts2.1ではアクションクラスと、ビジネスコンポーネントとの連携に必要な作業は、アクションクラスのインスタンス変数にAutowiredアノテーションを書くだけです(setterがあればAutowiredアノテーションは不要です)。

リスト7は、HelloActionクラスで、メッセージをビジネスコンポーネントHelloServiceから取得する例です。インスタンス変数にSpringFrameworkが提供するAutowiredアノテーションを附加するだけで、ビジネスコンポーネントがHelloActionクラスに自動的にインジェクションされます。

リスト7: HelloActionクラス

public class HelloAction {

     private static final long serialVersionUID = 1L;

    private String message;


    @Autowired   <--------- アノテーション

         private HelloService hello; <--------- インスタンス変数

         public String getMessage() {
          return message;

     }

    public String execute() throws Exception {

            message = hello.message();

            return "success";

    }

}

サンプルのようなHelloWorldを表示するだけのWebアプリケーションであれば、struts.xmlも不要です。

最後にSpringFramework側の設定ですが、リスト8にあるようにインジェクションの対象となるHelloServiceImplクラスにComponentアノテーションを書いて終わりです。SpringFrameworkの定義ファイルapplicationContext.xml(リスト9)も、利用しているタグは3つだけです。web.xml(リスト10)も、SpringFrameworkの定義ファイルの読込みを指示する行が追加されるだけです。

リスト8: アクションクラスにインジェクションされるHelloServiceImplクラス

@Component   <---------アノテーション

public class HellloServiceImpl implements HelloService {

    public String message() {

        return "*** HelloWorld!  No Config Injection! ***";

    }

}

リスト9: SpringFramework定義ファイル(applicationContext.xml)

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-2.5.xsd">

   <context:annotation-config />

   <context:component-scan base-package="com.starlightstorm.*"/>

</beans>

リスト10: web.xml

……
    <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/applicationContext*.xml</param-value>

    </context-param>
……

以上で、Struts2.1とSpring2.5の連携方法の解説は終わりになります。あっけないほど、簡単に連携できることが分かって頂けたかと思います。

開発時間減に効果的!

いまだに定義ファルの記述が面倒などと文句を言いながらも、Struts2.1の学習をすることが面倒だからとStruts1系を使って、Webアプリケーションの開発をされている方もいると思います。

しかし、本稿で解説したように、Struts2.1を利用すれば定義ファイルを極力減らしたWebアプリケーションの開発が可能です。大きく捉えればStruts1系とStruts2.1は大きく違わないので、Struts1を利用したことがある技術者であればStruts2へ移行するための学習時間は少なくて済みます。定義ファイルの記述が少なくなる分、メンテナンスやテストを考えると開発時間が減り、学習時間を考慮してもお釣りが来るかもしれません。Strutsに限らずフレームワークのバージョンアップによる差は、以前と違う部分が多く面倒だなと捉えるのではなく、以前より便利になった部分が多くて良いなと前向きに捉えることが重要です。

Struts2.1は情報の少なさがネックとなりますが、皆で利用するようになれば日本語の情報も増えていくと思われます。

今後のWebアプリケーション開発では、是非、Struts2.1も選択肢の1つに加えてみては如何でしょうか。