企業システムの常識をJBossで身につける
連載インデックスへ
企業システムの識をJBossで身につける(3)

DI(依存性の注入)×AOP(アスペクト指向)の常識


株式会社ビーブレイクシステムズ
相原 淳、上川 伸彦
2009/10/29


双方向DIができるWebフレームワーク「JBoss Seam」

 JBossの製品群で、DIをサポートしているフレームワークとして、JBoss Seamがあります。前回、このJBoss Seamを用いて簡単なサンプルアプリケーションを作成しました。その際に、JBoss Seamとは「JSFとEJB 3.0縫い合わせる(Seam)フレームワーク」であると説明しました。

アノテーションを使ったDIで「バイジェクション」?

 では、JBoss Seamを使用した、DIとは一体どのようなものなのでしょうか? それは、JBoss Seamのもう1つの特徴として、アノテーションを使ったDIになります。これにより、「双方向のDI」という意味の「バイジェクション」が可能で、具体的にはインジェクションとアウトジェクションといったアノテーションを使用してDIを行います。

  • @In インジェクション
  • @Out アウトジェクション

 バイジェクションを行うには、どのような設定が実用なのでしょうか? まず、バイジェクションを説明するに当たって、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を同時に記述することで「双方向のインジェクション」であることを表します。

JBoss Seamの「依存性の注入」

 ではここで、簡単にまとめてみたいと思います。これまでの説明の全体的なイメージを、以下に表してみます。今回は、冒頭で作成したCompanyクラスと新しく作成したEmployeesクラス(社員クラス)を使用します。

図4 Seamのインジェクション
図4 Seamのインジェクション

 このイメージは、@Inを指定したものです。CompanyクラスのEmployeesフィールドに、@Inを指定してインジェクションを行っています。ここで重要なことは、直接Seamコンポーネントを参照しているのではなく、Seamコンテキストに存在するEmployeesよりインジェクトしていることです。上記の@Inの説明で「Seamコンテキストからインジェクションする」とは、このことを意味しています。以下に、記述をまとめます。

図5 インジェクション、アウトジェクション、バイジェクション
図5 インジェクション、アウトジェクション、バイジェクション(画像をクリックすると、拡大します)

 @Outの記述は、@Inと変わりません。@Outの場合は、オブジェクトであるemployeesを使用した後に、SeamコンポーネントからSeamコンテキストにアウトジェクションを行います。バイジェクションは、同時に指定を行います。

JBoss Seamの「依存性の注入」のメリットとは

 以上が、JBoss Seamの「依存性の注入」です。では、JBoss Seamでの「依存性の注入」には、どのようなメリットがあるのでしょうか?

 これらのアノテーションを用いることで、DIの設定ファイルによる管理がなくなります。これによりXMLファイルの肥大化を防ぐことができます。また、DIコンテナによる「依存性の注入」は、DIコンテナの初期化時に、インスタンスをインジェクションするため、その後のインスタンスの構造が変更されることがありません。コンポーネントの状態は常に変化するため、@Inにより最新の状態を反映することにより、動的にコンポーネントの参照構造の変更を可能としているのです。

 ここまでで、JBoss Seamのアノテーションを用いた「依存性の注入」を説明しましたが、このアノテーションには、そのほかにもいろいろな種類や使い方があります。これらに関しては、下記記事をご参照ください。JBoss Seamやアノテーションについて詳しく解説してあります。

 JBossのDIについて説明したところで、今度は、JBoss AOPを説明したいと思います。

POJOでアスペクトの振る舞いを実装する「JBoss AOP」

 JBoss AOPとは、アスペクト指向プログラミングのフレームワークです。先ほど説明したような、基本的なアスペクト指向を取り入れた実装をサポートしています。主な特徴として、XMLファイルを使わなくてもアノテーション用いてアスペクトを可能にしていることや通常のJavaのクラス(POJO)を使用することでアスペクトの振る舞いを実装することが挙げられます。

 JBoss AOPの設定や実装方法に関しては、少し古いですが、下記記事をご参照ください。

結局、DI×AOPを使う有効性って何?

 以上、駆け足でしたが、DI×AOPがどのようなものかを大体知っていただけたかと思います。最後に、DIやAOPについて簡単にまとめてみます。

 まずDIに関しては、Javaのオブジェクト指向の概念であるインターフェイスを利用して、オブジェクトにインスタンスの注入できると説明しました。これにより設定ファイルを修正することで、オブジェクトをコンポーネント(部品)として扱うことができ、各オブジェクトの拡張性の向上やテストを行いやすくすることが可能です。

 一方のAOPでは、オブジェクト指向ではカバーできない処理の散在を、ひとまとめにすることで重複ロジックを削除できます。

 これらの技術を取り入れることによって、企業向けアプリケーションの開発では、開発面の生産性・メンテナンス面が向上し、プロジェクトの工数を抑えるなどの有効性につながっていきます。この有効性は、企業向けアプリケーション開発において非常に重要なことであるといえます。

 繰り返しますが、実際の企業向けアプリケーションの開発では、DI×AOPを取り入れたフレームワーク群を使用して、ごく当たり前のように開発業務が行われています。まだ、DI×AOPを用いたプロジェクトで開発を行ったことがない方やこれから初めてJavaを用いたWeb開発プロジェクトに配属される方は、DIやAOPの技術を意識してみてください。いままでとは違った観点で開発できると思います。

@IT関連記事


DI×AOPのこれまで、Seasarの今、そしてSlim3へ…
Seasar Conference 2009 White レポート DI×AOPを軸にしたJavaのWebシステム開発の過去・現在・未来や、日本発の世界標準を目指すSlim3の最新情報について
Java Solution」フォーラム 2009/4/2
DIとAOPがサーバ・コンポーネント技術を変える
J2EE Watch(7) EJBのような重量級のコンテナに対するアンチテーゼとして登場したDI。いまやDI+AOPは、J2EEの未来にも影響を与える存在となりつつある
Java Solution」フォーラム 2005/6/17
アスペクト指向プログラミング オーバービュー
The Rational Edge (24) 
IT業界はソフトウェア構築アプローチの改良の歴史でもある。このラインアップに最近加わったのが、アスペクト指向プログラミングだ
アスペクト指向のバリエーション解説
この連載では「アスペクト指向とは何か?」というところから始め、AspectJやJBossAOPなどを用いたAOPの実装を紹介していく
第1回 アスペクト指向の基礎とさまざまな実装
第2回 AspectJから学ぶアスペクト指向の理解
第3回 JBoss AOPとAOPフレームワークの役目
第4回 「AspectWerkz」の利用法
第5回 アスペクト指向理解のまとめ

プロフィール
相原 淳(あいはら じゅん)

株式会社ビーブレイクシステムズ開発部所属

専門分野:Webシステム開発・保守
2008年よりビーブレイクシステムズに在籍。
前職では、Javaを用いたWEB系のシステム開発や保守作業に従事。Javaの開発を行っていく中で、オープンソースに興味を持ち、その分野で活躍できるビーブレイクシステムズに転職し、現在に至る。

プロフィール
上川 伸彦(かみかわ のぶひこ)

株式会社ビーブレイクシステムズ技術担当取締役。

RDB製品の開発、各種業界団体におけるXML/EDI標準の策定やSOA基盤の設計などに従事。最近は、ITコンサル業よりも、業務システムの構築に携わることが多く、お客さまからの無理難題と向き合う日々を送っている。

1-2-3-4

 Index
第3回 DI(依存性の注入)×AOP(アスペクト指向)の常識
  Page1
いまさら聞けない「DI(依存性の注入)」入門
  Page2
いまさら聞けない「AOP」「アスペクト指向」入門
  Page3
DI×AOPの分野で世界中で使われている「Spring」
国産DI×AOPとして名を馳せる「Seasar2」
Googleが提供する次世代DIコンテナ「Guice」
  Page4
双方向DIができるWebフレームワーク「JBoss Seam」
POJOでアスペクトの振る舞いを実装する「JBoss AOP」
結局、DI×AOPを使う有効性って何?



Java Solution全記事一覧

TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH