SpringはAPサーバ上で使う方が使いやすい

初めてSpringを使ったシステム開発を経験中なのですが、ここ数日触っていて感じたことがこれ。
JavaEE環境上でSpringを使えば、EJB3の代替として非常に便利に使うことが可能です。context:component-scanタグによるコンポーネント自動設定は、アノテーションの他にも正規表現などを使って柔軟な定義が可能なので、EJB3的なアノテーション前提の設定も可能だし、Seasar2.3のAutoRegister的な設定もできます。最初にパッケージとクラスの命名規約を決めて、それぞれの自動登録とAOP設定が済めば、Springでも設定ファイルレス開発は可能です。
自分が感じるSpringの欠点は、トランザクションを独自インターフェイスで行うところですが、それもJTAを前提に定義すれば欠点ではなくなります。tx:jta-transaction-managerタグを一個書くだけで、WebSphere、WebLogic、OracleApplicationServerなど、主要なAPサーバ用のJTA設定をSpringが全て自動でやってくれます。
対してTomcat上ではJOTMを使うことになるのですが、このライブラリは数年間更新されておらず、JDBCドライバのXAドライバが使えない、ログの定義をしてもデバッグ情報が殆ど出ない・・・等欠点が多く、正直言って積極的に利用する意味は無いと感じました。可能であれば、Tomcat上ではJTA機能だけでもS2JTAを採用した方が良いです。SpringのjeeタグはJNDIルックアップを非常に簡潔に設定ファイル上で記述できるので、S2のJndiContextと組合せれば連携はとても簡単です。
JPAについては、Spring独自のJpaTemplateは使う意味が全く感じられないのですが、LocalContainerEntityManagerFactoryBeanを使えば、EJB3コンテナとほぼ同等の方法でコンテナ管理のEntityManagerを使うことが出来ます。JavaEE5サーバで管理されるEntityManagerFactoryも前述のjeeタグで簡単に取り込むことが出来ます。Spring上でJPAを使う場合、素のJPAの利用方法で定義し、SQLやCriteriaに関してはEntityManager#getDelegate()を使ってJPA実装ネイティヴAPIを利用するのがベストだと思います。やはり最も相性がいいのはHibernateで、SQLQueryとQriteriaインターフェイスを利用すれば、JPAの弱点はほぼ解消されます。
MVCフレームワークについては、沢山のFWに対応したサポートクラスが色々あるので、採用したMVCフレームワークをそのまま使えばいいと思います。これはJSFしか実質使えないEJB3に対する大きなアドバンテージでしょうね。元のフレームワークを拡張して独自のFWとして提供することが多いS2系のフレームワークとは違って、Webフレームワークについては素のまま使えることを売りにしているみたいです。プロジェクト毎の要件と照らし合わせて、どちらが要件を満たしているかで判断・選定すればいいと思います。
以上の機能から感じたSpringの特長は、より柔軟性の高いEJB3の代替機能というものでした。Warプロジェクト前提で開発が可能で、DI+AOPは柔軟な自動設定が可能で、コンテナ管理JPAがそのまま使えて、JTAトランザクションを簡単にAOPで定義できます。ただし、核となるJTA実装を持たないので、Tomcat前提だとどうしてもトランザクションまわりとJPAとの連携部分が微妙になってしまいます。逆にAPサーバ上であれば、APサーバが提供するトランザクション・コネクションプール・JPA機能を非常に単純に取り込むことが可能です。Springを使う場合は、TomcatではなくオープンソースJavaEEサーバをまず候補に考えてみるのが、最も楽に強力に使える組合せになると感じました。