デベロッパー

デベロッパー

JSF 2.0のビーン検証と依存性の注入(2/2)

Sangeetha S, Nitin KL, Ananya S
2010年8月10日 / 10:00
 
 
 

JSF 2.0における依存性の注入

依存性の注入(DI)とは、通常 Java EE コンテナを使って特定のリソースに外部依存を提供する概念だ。これにより、一連のサービスを Java EE コンポーネントに提供できるようになる。DI を使用する最大の目的は、クライアントプログラムから特定のリソースを参照もしくは作成する作業を回避することだ。JSR-330の一部である依存性の注入はアノテーションのセットによって構成されている。

Java EE 6最大の機能1つが、JSR-299に明記されたコンテキストおよび依存性の注入(CDI、旧 Web Bean)による DI 実現のためのアノテーションの標準化だ。JSR-299に DI 仕様(JSR-330)と管理ビーン仕様(JSR-316)が含まれるため、JSR-299で「注入可能」なクラスは、フレームワークを越えて移植が可能になっている。

JSR-299に明記されているように、CDI は基本的に以下の2つのサービスの提供を担当する。
  • コンテキスト:ステートフルコンポーネントのライフサイクルややりとりと、明確で拡張可能なライフサイクルコンテキストを結びつけられるようにする。
  • 依存性の注入:これらのコンポーネントをタイプセーフな方法でアプリケーションに注入したり、導入時にインターフェースの特定のインプリメンテーションを注入できるようにする。
Web アプリケーションの場合、JSR-299を使えばどの Java EE コンポーネント(EJB など)でも JSF 管理ビーンと一緒に使用できるようになる。EJB (Enterprise JavaBeans)は本来トランザクション対応だが、ウェブ層上のコンポーネント(JSF 管理ビーン)はトランザクション対応でない。JSR-299は、開発者が JSF 管理ビーンと EJB を交換できるようにすることで Java EE アプリケーションのトランザクションのギャップを埋める。

ネットクイズ・アプリケーションでは、「SampleTest」管理ビーンが Request スコープ内にあるが、これはサンプル問題を見られるようにすることでユーザーが問題の感触をつかむのを助ける。
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class SampleTest {
// Some code
}

このチュートリアルでは、「SampleTest」管理ビーンクラスを修正し、アプリケーションのコードとステータスの両方を含んだコンテキストクラスとして動作するようにする。

SampleTest」コンテキストクラスには、「「javax.inject」パッケージ」で定義された「@Named」アノテーションが付く。「@Named」アノテーションは、具体的な名前を使ってクラスをマークする。「@Named」アノテーションに引数が1つもない場合は、クラス名の先頭の1文字を小文字にし(JSF 2.0のビーン命名手法)、それをデフォルトのビーン名として考える。クラス には、「javax.enterprise.context」パッケージで定義された「@RequestScoped」(これでビーンが依頼スコープ内のすべてのコンポーネントに提供されるようになったことを示す JSR-299専用のアノテーション)の注釈も付く。
@Named
@RequestScoped
public class SampleTest { 
@SampleTestQuestion
@Inject
private String sampleQuestion;
//Some more Code
}


javax.inject」パッケージで定義された「@Inject」アノテーションは、「SampleTest」 クラスの「sampleQuestion」プロパティに適用される CDI アノテーション。「@Inject」アノテーションは、依存性を注入しなくてはならないポイントを特定する。「sampleQuestion」プロパティには「@SampleTestQuestion」修飾アノテーションも付くが、これが実際にプロパティに注入される実際のインプリメンテーションとなっている。修飾子を使うことにより、同じビーンタイプで異なるインプリメンテーションを実現することができる。「@SampleTestQuestion」修飾子は、ユーザーが試しに回答できるサンプル質問を「sampleQuestion」ビーンプロパティに注入する。 「@SampleTestQuestion」修飾子は以下のように定義される。

@Target ({ TYPE, METHOD, PARAMETER, FIELD })
@Retention (RUNTIME)
@Documented
@Qualifier
public @interface SampleTestQuestion {
}

@Target」、「@Retention」、および「@Documented 」の各アノテーションは「java.lang.annotation」パッケージのなかで Java 言語レベルで定義される。
  • @Target」アノテーションは、このアノテーションが該当するプログラムのすべての要素の特定に必要になる。
  • @Retention」アノテーションは、特定のアノテーションの保管期間を示し、「@SampleTestQuestion」は、ネットクイズ・アプリケーションの実行中は完全に保持される。
  • @Documented」アノテーションはデフォルトで、Javadoc あるいはほかの同様のツールでドキュメント化する必要のあるタイプを提案する。
javax.inject」パッケージで定義された「@Qualifier」は、注入される Java クラスのインプリメンテーションやインターフェースを特定するのに必要な修飾アノテーションを認識するために使用される。「@Interface」は「Annotation」タイプを作成するのに使用するキーワードとなっている。

次は、注入処理発生時に非明示的に呼び出されるプロデューサーメソッドを定義する「SampleTestQuestionGenerator」クラスを定義する必要がある。このクラスは、修飾子のプロデューサーメソッドをマークするために「@Produces」(「javax.enterprise.inject」パッケージで定義)で注釈の付いた「generate()」メソッドを持つ。「generate()」メソッドにもこのメソッドがプロデューサーとして動作する修飾子でアノテーションが付く。ジェネレータクラスは、「@javax.enterprise.context.ApplicationScoped」で注釈を付けることによりアプリケーションスコープのなかで定義される。
@ApplicationScoped
public class SampleTestQuestionGenerator {
    @Produces
    @SampleTestQuestion
    String generate () {
        return "First Prime Minister of India";
    }
}

ログインが成功したら、ユーザーは「Try Sample」リンクをクリックして「Sample Question」ページに移動し、サンプル問題をチェックすることができる。「SampleTest」 クラスには「@javax.inject.Named」アノテーションの注釈が付き、ここでは特定のスコープ内のアプリケーションのなかの決まった名前によってクラスが特定される。「SampleTest」 クラスの「sampleQuestion」プロパティは「@javax.inject.Inject 」と「@SampleTestQuestion」アノテーションによる依存性の注入を必要とする。「@SampleTestQuestion」修飾子はジェネレータクラスの「SampleTestQuestionGenerator」を持ち、これは「@javax.enterprise.inject.Produces」(リソースに依存性を注入する際に呼び出されるメソッド)で特定されたプロデューサーメソッドの「generate()」を持っている。

まとめ

JSF 2は、Java を使った Web アプリケーションの開発プロセスを簡略化する新機能をいくつか搭載している。特に、JSF 2のビーン検証サポートは専用のタグと属性を使う既存の確認モデルに代わるものとなっている。依存性の注入と JSF 2.0を一緒に使えば、ビーンに名前を与え、JSF アプリケーションのスコープ内のどこからでもアクセスできるようになる。注入を受けたクラスは、これで各種フレームワークを越えてポータブルになる。

謝辞

アイデア、指導、そして支援をいただき、励まし続けてくれた Subrahmanya 氏(SV、VP、ECOM Research Group、E & R)と、快く本稿の校閲を行い、貴重な論評をしてくれた Mahalakshmi 氏に心より感謝したい。

著者紹介

Sangeetha S.(Sangeetha S.)
Sangeetha S.は Infosys Technologies 電子商取引研究所のシニア技術アーキテクト。Java および Java EE アプリケーションの設計と開発で10年以上の経験を持つ。また、「J2EE Architecture」の共著や、Java 関連のネット記事の執筆もある。
Nitin KL<(Nitin KL<)
Nitin KLも Infosys Technologies 電子商取引研究所勤務。Hibernate、iBATIS、および JPA を使った Java EE アプリケーションの設計と開発に携わっている。
Ananya S.(Ananya S.)
Ananya S.も Infosys Technologies 電子商取引研究所勤務で、やはり Hibernate、iBATIS、および JPA を使った Java EE アプリケーションの設計と開発に携わっている。

New Topics

Special Ad

ウマいもの情報てんこ盛り「えん食べ」
ウマいもの情報てんこ盛り「えん食べ」 「えん食べ」は、エンジョイして食べる、エンターテイメントとして食べものを楽しむための、ニュース、コラム、レシピ、動画などを提供します。 てんこ盛りをエンジョイするのは こちらから

Hot Topics

IT Job

Interviews / Specials

Popular

Access Ranking

Partner Sites