サービスオブジェクト管理は、どのアプリケーションサーバにも備わっているコアサービスです。アプリケーションが管理する一般のJavaオブジェクトと比べ、コンテナの管理するサービスオブジェクトには以下のようないくつかの重要な優位性があります。
- 疎結合:クライアントアプリケーションが直接サービスオブジェクトをインスタンス化することは無いので、クライアントは実装クラスの名前を知る必要はありません。必要なのはサービスインタフェースのみで、インタフェース名または事前に定めた文字列で、サーバからサービスのスタブオブジェクトをルックアップするだけです。こうすることで、クライアントのコードを変更せずにサービス実装を複数提供することができるのです。
- ネットワーク非依存:サービスは、HTTP、TCP、メッセージキューなど、ほとんどあらゆるネットワークトランスポート経由で利用できます。また、サービスは複数台構成のクラスタ環境でも利用できます。クライアントはサービスのスタブオブジェクトをルックアップし、ローカルインタフェースと同じようにサービスインタフェースのメソッドを呼ぶだけです。メソッドの呼び出しは、適切なネットワークトランスポートを経由して(あるいは、クライアントとサーバが同じJVMにある場合はローカル参照を経由して)自動的に適切なサーバにルーティングされます。
- リソース・プール:サービスオブジェクトを管理することで、サーバは重要なリソースを集中管理することができます。クライアントアプリケーションは、オブジェクトを破棄したりコネクションをクローズしたりすることに煩わされることはありません。サーバはサービスオブジェクトを作成してプーリングし、余分なオブジェクト生成を軽減します。
EJB 3.0では、管理対象のサービスオブジェクトはすべて、POJO(たとえばセッションBean)または非常に軽量なコンポーネント(たとえばメッセージ駆動型Bean)です。EJB 3.0の標準コンポーネントに加え、JBoss EJB 3.0拡張機能ではさらにJMXのPOJOやメッセージ駆動型POJOをサポートしており、JMXバスやメッセージチャネルを介してPOJOを起動できる仕組みを提供しています。管理対象のサービスオブジェクトの設定は、簡単なアノテーションで宣言します。このハイキングのトレイルでは、JBossアプリケーションサーバにおけるコンテナ管理サービスオブジェクトの開発方法について学習します。最後のトレイルでは、依存性注入のデザインパターンについても議論し、サービスオブジェクトを自動的にアプリケーションで利用できるようにする方法を学びます。