【コラム】

Java API、使ってますか?

33 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2

33/60

前回は「JSR 299: Web Beans」についてEarly Draftを元にその概要を紹介した。今回は同仕様の肝であるWeb Beanコンポーネントを構成する各要素について細かく見ていこうと思う。ソースコード例はEarly Draftより部分的に引用している。

コンポーネントタイプ

コンポーネントタイプは、コンテナがそのWeb Beanコンポーネントの実装クラスを特定するために使用される。また、コンポーネントの優先度を決定するためにも使われる。コンポーネントタイプはアノテーションによって宣言することができ、JSR 299には@Componentと@Standardという2種類のタイプがあらかじめ用意されている。Web Beansコンテナによって提供されるコンポーネントはすべて@Standardであり、アプリケーションで宣言するコンポーネントにはリスト1のように@Componentを指定する。

リスト1 コンポーネントタイプの使用例

@Component
public class MyComponent { ... }

オリジナルのコンポーネントタイプを定義することもできる。その場合、@ComponentType、@Target、@Retentionなどのアノテーションを使ってリスト2のように宣言する。

リスト2 コンポーネントタイプの定義

@ComponentType
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface MyComponentType {}

実装クラスとプロデューサメソッド

Web Beanの実装クラスは、Web Beanコンポーネントの状態や振る舞いを決定する。Web Beanコンポーネントのプロデューサメソッドは、インジェクトされるオブジェクトのソースとして振る舞うメソッドを指す。プロデューサ・メソッドは@Producesアノテーションを用いてリスト3のように定義する。@AllProductsはバインディングアノテーション(後述)である。

リスト3 プロデューサメソッドの定義

@Component
@Stateless
public class ShopBean implements Shop {
       @Produces @AllProducts
       public List getAllProducts() { ... }
}

プロデューサメソッドはリスト4のようにインジェクトできる。

リスト4 プロデューサメソッドコンポーネントのインジェクト

@In @AllProducts List catalog;

APIタイプ

Web BeanのAPIタイプとは、クライアントから見たWeb Beanコンポーネントの型を指す。Web Beanコンポーネントは複数のAPIタイプを持つことができる。各Web BeanコンポーネントのAPIタイプは以下のようにして決まる。

  • 実装クラスがセッションBeanでない場合、その実装クラスおよびスーパークラス、実装インタフェースがすべてAPIタイプとなる
  • 実装クラスがセッションBeanの場合、すべてのローカルインタフェースとそのスーパーインタフェースがAPIタイプになるが、リモートインタフェースは含まれない
  • プロデューサメソッドコンポーネントの場合、メソッドの戻り値の型とすべての実装インタフェースがAPIタイプとなる。戻り値の型がコンクリートクラスの場合、そのスーパークラスもAPIタイプに含まれる

バインディングアノテーション

バインディングアノテーションは、必要とするWeb Beanコンポーネントを特定するために独自に定義するアノテーションである。@BindingTypeアノテーションを用いてリスト5のように定義する。

リスト5 バインディングアノテーションの定義

@BindingType
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD})
public @interface AllProducts {}

定義したバインディングアノテーションは、Web Beanの実装クラスやプロデューサメソッドに指定することができる。そしてそれらのWeb Beanコンポーネントをインジェクトする際には、バインディングアノテーションによってソースとなるオブジェクトが特定される(リスト3はリスト4参照)。したがって、同じAPIタイプでもバインディングアノテーションが異なればソースのオブジェクトも異なる。

スコープ

すべてのWeb Beanコンポーネントはスコープを持っており、それによってライフサイクルと他のコンポーネントからの可視性が決まる。Web BeansではServlet仕様で定義される各スコープ、すなわちリクエストスコープ、アプリケーションスコープ、セッションスコープに対応した@RequestScoped、@ApplicationScoped、@SessionScopedというアノテーションが用意されており、これをWeb Beanコンポーネントに指定すればよい。その他に対話型のコンテキストに対応した@ConversationScopedがある。

また、@ScopeTypeアノテーションによって独自のスコープを定義することもできる。リスト6のようにする。

リスト6 スコープの定義

@ScopeType
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface MethodScoped {}

コンポーネント名

通常、Web Beanコンポーネントはコンポーネント名を持つ。これはUnified EL式の中でコンポーネントを特定するために使用される。デフォルトではコンポーネントの実装クラス名がそのままコンポーネント名となる。プロデューサメソッドの場合はメソッド名か、またはメソッド名がJavaBeansプロパティのGetter形式ならばそのプロパティ名がコンポーネント名となる。たとえばメソッド名が「getProducts」ならばコンポーネント名は「products」だ。

デフォルト以外のコンポーネント名を付けたい場合には、リスト7のように@Namedアノテーションで指定すればよい。

リスト7 コンポーネント名の指定

@Component
@Named("products")
public class ProductList implements DataModel { ... }

Web Beans仕様にはもうひとつ、pseudo-scopeと呼ばれるスコープがある。通常、2つのコンポーネントX、YがそれぞれコンポーネントZをインジェクトしていた場合、それぞれのインスタンスx、yは同じZのインスタンスへの参照を保持する。しかしpseudo-scopeを持つコンポーネントは、複数のコンポーネントでインスタンスが共有されない。そしてpseudo-scopeのコンポーネントのライフサイクルは、インジェクトされた各コンポーネントのライフサイクルに依存することになる。poseudo-scopeの指定には@Dependentアノテーションを利用する。

今回紹介したソースコードはすべてアノテーションを用いた例だが、JSR 299では同様の定義をXMLを用いて記述する方法も定められている。詳細はEarly Draftを参照していただきたい。JSR 299は2008年4月に正式リリースされる予定となっていたが、現在のところスケジュールは遅れ気味のようだ。いずれにせよJava EE 6のリリース (2008年第四半期に予定) までには正式仕様が決まるはず。Java EE 6を導入する予定のあるユーザは早い段階でチェックしておくといいだろう。

33/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る

提供:マイナビ

会員登録はこちら

大学・大学院・短大・専門学生向けの就職情報サイト「マイナビ2010」「マイナビ2009」に今すぐ登録しよう!  大手企業からベンチャー企業までの約13,000社の企業情報を公開、エントリーが可能です。2010年卒予定の方は「マイナビ2010」に、2009年卒予定の方は「マイナビ2009」に登録してください。

毎日コミュニケーションズはプライバシーマークを取得しています。



転職ノウハウ

あなたが本領発揮できる仕事を診断
あなたの仕事適性診断

シゴト性格・弱点が20の質問でサクッと分かる!

「仕事辞めたい……」その理由は?
「仕事辞めたい……」その理由は?

71%の人が仕事を辞めたいと思った経験あり。その理由と対処法は?

3年後の年収どうなる? 年収予報
3年後の年収どうなる? 年収予報

今の年収は適正? 3年後は? あなたの年収をデータに基づき予報します。

激務な職場を辞めたいが、美女が邪魔して辞められない
激務な職場を辞めたいが、美女が邪魔して辞められない

美人上司と可愛い過ぎる後輩に挟まれるエンジニアの悩み

人気記事

一覧

イチオシ記事

新着記事

求人情報