StrutsとSpringを連携するには、一般に4つの方法があります。
4つにはそれぞれ欠点があるので、システムの性格に応じて方法を選んでいく必要があります。
そして、自分が考える第5の方法があるので、それはあとの記事 で見ることにします。
名称 | 概要 | Spring設定ファイルへの記述 | 制限がかかる箇所 |
---|---|---|---|
ActionSupport系を使う | Springが提供するActionSupportクラスを継承させる方法です。ActionSupportクラス自体はStrutsのActionクラスを継承しています。 |
なし | Springの設定ファイルにActionクラスが記述できない(DIが使えない)。つまり、Actionに対してAOPなどを使用できない。 |
DelegatingActionProxy系を使う | Springが提供するDelegatingActionProxyクラスをStrutsのActionとして使用する。 |
必要 | ※問題点1 |
DelegatingRequestProcessor系を使う | Strutsの設定ファイルに左記のクラスを設定することでRequestProcessorを乗っ取ることで連携します。 | 必要 | ※問題点1 と、StrutsではRequestProcessorは1つしか設定できない問題あり。 それをSpringが使ってしまうので、他の人がReqestProcessorの機能拡張をしたいときにできない。 |
AutowiringRequestProcessor系を使う | Strutsの設定ファイルに左記のクラスを設定することでReqestProcessorを乗っ取ることで連携します。 ただし、Springファイルにパスを記述する必要がないため、※問題点1のようなことが発生しません。 |
なし | DIが使えない。 AOPが使えない。 |
これらの実際のやり方は、以下のページが詳しいです。
http://itpro.nikkeibp.co.jp/article/COLUMN/20080929/315624/
メリット、デメリットのまとめ(下のほうに表があります)
http://itpro.nikkeibp.co.jp/article/COLUMN/20080929/315624/?ST=develop&P=5
それぞれの問題点:
http://d.hatena.ne.jp/chiba_mk3/20080701/1215187585
※問題点1について
1.Strutsのactionに設定するpathと同じidでSpring設定ファイルにActionクラスを設定しないといけません。
ですので、1つパスが増えると2つのファイルに記述をしないといけないという問題があります。
2.Springであれば、beanの使い回しができるのが当たり前ですが、beanのidをパス名と合わせない
といけないです。ですので、同じActionクラスでも、path名が違えば、違うbeanとして設定しないといけません。
3.もうひとつ、beanのid名を自由に選べないという弱点もあります。
以下の感じでファイルに2つの記述が必要です。
Spring設定ファイル:
<bean name="/login" class="Aaaa"/>
<bean name="/topmenu" class="Aaaa"/>←classが同じなので本当は上だけ記述して使いまわしたいけどできない
Struts設定ファイル:
<action path="/login" ...../>
<action path="/topmenu" ...../>
※この問題の逃げ道はあります。(参照: 連携方法を拡張して、より自由度が高い連携をするには? )
※「DIが使えない」問題点について
これはどういう意味かというと、StrutsのActionクラスをSpringの設定ファイルに設定できないという意味です。
これによる問題点は、Actionクラスにsetterを作成しても、Springの設定ファイル上で設定ができないということです。
もっと言うと、Springを使用できれば何かあってもsetterで設定するクラスや定数を変更することで動作を変更できます。これが全くできないということになります。
また、Springで設定されていないので、当然ながらAOPも使用できないということにもなります。
・DIxAOPの機能について
の注意点を参照。
【結局どれがいいの?】
正直どれも何かしらの面倒くささはあります。
しかし、面倒なことよりも、後で機能が使えない制限の方が問題です。
例えばDIを使えないとか、AOPを使えないとか、ReqestProcessorを拡張できないとかです。
すると必然的に以下の物が残ります。
・DelegatingActionProxy
個人的には、これがいいと思っています。
が、ケースバイケースなので、システムごとに考えなきゃですかね。
参照: