X

An Oracle blog about WebLogic Channel

Contexts and Dependency Injection(CDI)入門

WebLogic勉強会 通信

WebLogic Serverファンの皆様、こんにちは、WebLogic Server勉強会通信です。

6月20日に開催された「第37回WebLogic Server勉強会@東京」の後半の「Contexts and Dependency Injection(CDI)」(日本オラクル株式会社 Fusion Middleware事業統括本部 松林 晶)セッションをレポートします。今回はJava EE 6で仲間に加わったCDIがテーマです。DI(Dependency Injection)はJava EE 5でも利用できましたが利用は限定的でした。CDIは、DIをより汎用的にしたもので、アプリケーションのコンポーネント間を疎結合にすることができます。松林さんが入門者向けにCDIの基本概念から使用方法を紹介しています。(日本オラクル Fusion Middleware事業統括本部 佐々木 政和)

CDIとは


今回のテーマはCDIです。Java EE 6に組み込まれたJSR299: Contexts Dependency Injection仕様です。
これまでのDependency Injection (依存性の注入)とAspect-Oriented Programming (AOP)のInterception
技術がベースになって標準仕様として策定されたものです。
CDI仕様の狙いは、アプリケーションのコンポーネント間を疎結合することです。プレゼンテーション層、
ビジネスロジック層、インテグレーション層の各開発作業を並行して進めることができます。
また、アノテーションを使用することで保守性に優れたシンプルなアプリケーション構築が行えます。
インスタンスの依存関係やライフサイクルの管理は、すべてCDIコンテナが担当してくれます。

CDIを使用するための環境条件は2つ


まず1つ目はCDIコンテナ、すなわち、Oracle WebLogic Server 12cのようなJava EE 6をサポートしている
アプリケーションサーバが必要です。2つ目はbeans.xmlファイルです。WebアプリケーションではWEB-INF/beans.xml、
EJBではMETA-INF/beans.xmlファイルの存在有無によりCDI実行環境のオンオフが決まります。beans.xmlの中身は
特別に指定するものが無ければ空で構いません。

Java EE 5のDI(Dependency Injection)


Java EE 5でもDIの仕様が含まれていました。しかし、制限事項が多くアプリケーションはそれほど
シンプルに開発できませんでした。例えば、注入する種別によってアノテーションが異なる(@EJB、
@Resource、@WebServiceRef)など。

Java EE 6のCDI


Java EE 6のCDIは、注入する種別が異なっても共通の@Injectアノテーションで注入が可能です。
また、インジェクションする位置もメンバー変数や引数など自由度が増しアプリケーションを柔軟に開発できます。

@Qualifierでインジェクションの依存関係を決定


下記の様に同じインタフェース定義を持つ実装クラスが複数ある場合は、カスタムの限定子@Qualifierを
使用してインジェクション・ポイントをインジェクション対象クラスの両方に@JPNを付けて解決できます。

@Produceで動的に注入可能


下記の様に動的に注入することが可能です。

インジェクション・オブジェクトのライフサイクル


CDIではインスタンスの生成や破棄はコンテナが行います。インジェクション・オブジェクトの
ライフサイクルは下記のオプションで設定可能です。デフォルトは、バインドされたオブジェクトの
ライフサイクルと同じになります。

EL(Expression Language) 式からのアクセス


EL式からアクセスできるのでJSFのManagedBeanの代わりにインジェクション・オブジェクトを使用できます。

まとめ


Java EE 6の仕様の一つであるCDIの特長を見て来ました。Java EE 5のDIや各種のAOPなどの
機能がすっきりとまとめられたものです。DI, AOPを使用しているアプリケーションや
フレームワークなどは今後、CDI仕様に基づくアプリケーション実装に変わっていくと思われます。
この機会にCDIのアプリケーション開発にチャレンジしてください。本セッションの資料


Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.Captcha
Oracle

Integrated Cloud Applications & Platform Services