JBoss とSpring:J2EEをめぐる2つのアプローチ

Linuxにさまざまなディストリビューションパッケージがあるように、JavaオープンソースプロダクトにはJBossがあります。JBossは、もはやEJBサーバという枠だけには収まりません。JBoss 4では、Tomcat, Hibernate, JGroups, HSQLDBなどが最初からインテグレートされます。JBossをダウンロードしたら、特別なセットアップをしなくても、Hibernateアプリをホットデプロイするだけですぐに動く。それだけでものすごく便利だと思います。

JBossをOSに例えると、その上にアプリケーションが乗るわけですが、「アプリケーションのビジネスロジックをいかに管理するか」という点では現在たいへん混沌とした状況にあります。J2EE仕様は膨れ上がり、それらのAPIを駆使するのは大変難しくなっています。Hibernateは「永続性」に特化したものですから、それだけですべての問題を解決するわけではありません。

JBoss 4ではJBossAOPというAOPフレームワークを提供しようとしています。これはAOPによってPOJO(普通のJavaオブジェクト)にセキュリティやトランザクションのようなサービスを後から追加できるようにするものです。JBoss上でJBossAOP以外のAOP処理系を使いたければ、それも可能です。JBoss上でAspectJを使うことも可能です*1

AOPPOJOにサービスを追加することは可能にしますが、POJO間の依存関係・参照関係を解決するという仕事はやってくれません。つまり、JNDIやMBeanServerのような明示的なAPIを使わなくてもPOJO間で相互に参照できる仕組みを提供するのが、PicoContainerに代表される軽量コンテナです。軽量コンテナのレイヤ図にすると次のようになります(参照しやすいようにL1..L4とラベルをつけます)。JBossAOPフレームワークから下を提供しますが軽量コンテナは提供しません。

私はAOPフレームワークだけでは不十分で、POJOの管理には軽量コンテナの存在が不可欠だと思っています。コンポーネント化とまで言わなくとも、ある程度大きなシステムでは、POJOの差し替えやバージョンアップなどには構成管理が不可欠であると思うからです。ここでPicoContainerをもってくるのでも良いのですが、Springフレームワークの存在に注目しています(SpringはTomcatがあれば動作するのでJBossは必要ありませんが、JBoss上でも動作します)。Springは上のレイヤ図のL1からL3までを提供します。

Springプロジェクトのキャッチフレーズは"J2EE Made Easy"です。Springは軽量コンテナとAOPフレームワークを提供することで、EJBコンテナに依存しない統合的なJ2EEフレームワークを作り出そうとしています。これは、J2EEサーバからのユーザ便宜を追求したJBossとは対照的で、いわばアプリケーション側からのアプローチです。JBoss上でSpringを動作させると、機能的にはAOPフレームワークの機能が重複することになります。AOPの歴史はまだ浅く、AOPフレームワークデファクトと言われるものはまだ存在しません。このエリアがJ2EEをめぐる戦いの最前線なのです。誰が、J2EEAOPフレームワークを制するのか。

*1:JBossAOPが注目されているのは、JBossというOSに特化していることと、最初からOSにバンドルされているということなのです