JBossの製品群で、DIをサポートしているフレームワークとして、JBoss Seamがあります。前回、このJBoss Seamを用いて簡単なサンプルアプリケーションを作成しました。その際に、JBoss Seamとは「JSFとEJB 3.0縫い合わせる(Seam)フレームワーク」であると説明しました。
では、JBoss Seamを使用した、DIとは一体どのようなものなのでしょうか? それは、JBoss Seamのもう1つの特徴として、アノテーションを使ったDIになります。これにより、「双方向のDI」という意味の「バイジェクション」が可能で、具体的にはインジェクションとアウトジェクションといったアノテーションを使用してDIを行います。
バイジェクションを行うには、どのような設定が実用なのでしょうか?
まず、バイジェクションを説明するに当たって、JBoss Seamの中心的な概念であるSeamコンテキスト(context)とSeamコンポーネント(component)について簡単に説明します。
Seamコンテキストとは、JBoss Seam上でSeamコンポーネントを管理している箱のようなものです。
その中で管理されているSeamコンポーネントとは、@Nameアノテーションが付加されたPOJOのクラスのことです。これは、前回作成したSeamActionクラスが当てはまります。そのとき、この@Nameを宣言することで、Seamのコンポーネントとして認識されているということを説明しました。JBoss Seamでは、このような仕組みによってオブジェクトの状態は管理されています。
以上を踏まえたうえで、@In、@Outのアノテーションについて説明します。
@Inは、「Seamコンポーネントの呼び出し時に、Seamコンテキストからインジェクションされることを指定する」ことを表します。
@Outは、「Seamコンポーネントの呼び出しが終了した際に、SeamコンポーネントからSeamコンテキストにアウトジェクトする」ことを表します。
バイジェクションに関しては、@Inと@Outを同時に記述することで「双方向のインジェクション」であることを表します。
ではここで、簡単にまとめてみたいと思います。これまでの説明の全体的なイメージを、以下に表してみます。今回は、冒頭で作成したCompanyクラスと新しく作成したEmployeesクラス(社員クラス)を使用します。
このイメージは、@Inを指定したものです。CompanyクラスのEmployeesフィールドに、@Inを指定してインジェクションを行っています。ここで重要なことは、直接Seamコンポーネントを参照しているのではなく、Seamコンテキストに存在するEmployeesよりインジェクトしていることです。上記の@Inの説明で「Seamコンテキストからインジェクションする」とは、このことを意味しています。以下に、記述をまとめます。
@Outの記述は、@Inと変わりません。@Outの場合は、オブジェクトであるemployeesを使用した後に、SeamコンポーネントからSeamコンテキストにアウトジェクションを行います。バイジェクションは、同時に指定を行います。
以上が、JBoss Seamの「依存性の注入」です。では、JBoss Seamでの「依存性の注入」には、どのようなメリットがあるのでしょうか?
これらのアノテーションを用いることで、DIの設定ファイルによる管理がなくなります。これによりXMLファイルの肥大化を防ぐことができます。また、DIコンテナによる「依存性の注入」は、DIコンテナの初期化時に、インスタンスをインジェクションするため、その後のインスタンスの構造が変更されることがありません。コンポーネントの状態は常に変化するため、@Inにより最新の状態を反映することにより、動的にコンポーネントの参照構造の変更を可能としているのです。
ここまでで、JBoss Seamのアノテーションを用いた「依存性の注入」を説明しましたが、このアノテーションには、そのほかにもいろいろな種類や使い方があります。これらに関しては、下記記事をご参照ください。JBoss Seamやアノテーションについて詳しく解説してあります。
JBossのDIについて説明したところで、今度は、JBoss AOPを説明したいと思います。
JBoss AOPとは、アスペクト指向プログラミングのフレームワークです。先ほど説明したような、基本的なアスペクト指向を取り入れた実装をサポートしています。主な特徴として、XMLファイルを使わなくてもアノテーション用いてアスペクトを可能にしていることや通常のJavaのクラス(POJO)を使用することでアスペクトの振る舞いを実装することが挙げられます。
JBoss AOPの設定や実装方法に関しては、少し古いですが、下記記事をご参照ください。
以上、駆け足でしたが、DI×AOPがどのようなものかを大体知っていただけたかと思います。最後に、DIやAOPについて簡単にまとめてみます。
まずDIに関しては、Javaのオブジェクト指向の概念であるインターフェイスを利用して、オブジェクトにインスタンスの注入できると説明しました。これにより設定ファイルを修正することで、オブジェクトをコンポーネント(部品)として扱うことができ、各オブジェクトの拡張性の向上やテストを行いやすくすることが可能です。
一方のAOPでは、オブジェクト指向ではカバーできない処理の散在を、ひとまとめにすることで重複ロジックを削除できます。
これらの技術を取り入れることによって、企業向けアプリケーションの開発では、開発面の生産性・メンテナンス面が向上し、プロジェクトの工数を抑えるなどの有効性につながっていきます。この有効性は、企業向けアプリケーション開発において非常に重要なことであるといえます。
繰り返しますが、実際の企業向けアプリケーションの開発では、DI×AOPを取り入れたフレームワーク群を使用して、ごく当たり前のように開発業務が行われています。まだ、DI×AOPを用いたプロジェクトで開発を行ったことがない方やこれから初めてJavaを用いたWeb開発プロジェクトに配属される方は、DIやAOPの技術を意識してみてください。いままでとは違った観点で開発できると思います。
株式会社ビーブレイクシステムズ開発部所属
相原 淳(あいはら じゅん)
専門分野:Webシステム開発・保守
2008年よりビーブレイクシステムズに在籍。
前職では、Javaを用いたWEB系のシステム開発や保守作業に従事。Javaの開発を行っていく中で、オープンソースに興味を持ち、その分野で活躍できるビーブレイクシステムズに転職し、現在に至る。
株式会社ビーブレイクシステムズ技術担当取締役
上川 伸彦(かみかわ のぶひこ)
RDB製品の開発、各種業界団体におけるXML/EDI標準の策定やSOA基盤の設計などに従事。最近は、ITコンサル業よりも、業務システムの構築に携わることが多く、お客さまからの無理難題と向き合う日々を送っている。
Copyright © ITmedia, Inc. All Rights Reserved.