Contexts and Dependency Injection(CDI)入門

2,857 views

Published on

「Contexts and Dependency Injection(CDI)入門」

本セッションではJava EE 6で仲間に加わったCDIを取り上げます。DI(Dependency Injection)はJava EE 5でも利用できましたが利用は限定的でした。CDIは、DIをより汎用的にしたもので、アプリケーションのコンポーネント間を疎結合にすることができます。入門者向けにCDIの基本概念から使用方法を紹介します。皆様も、Java EEアプリケーションを拡張性の高い疎結合なアーキテクチャにしましょう!

日本オラクル Fusion Middleware事業統括本部
松林 晶

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,857
On SlideShare
0
From Embeds
0
Number of Embeds
77
Actions
Shares
0
Downloads
73
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Contexts and Dependency Injection(CDI)入門

  1. 1. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.1WebLogic Server 勉強会Context and Dependency Injection(CDI)入門2013年 6月20日日本オラクル株式会社Fusion Middleware事業統括本部 松林晶
  2. 2. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.2Program Agenda Context and Dependency Injection(CDI)– CDIとは– CDI 1.1 New Feature(Java EE 7)
  3. 3. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.3Context and Dependency Injection(CDI) CDIとは Java EE 6の仕様の一つ– Contexts:サーバ上の状態を表現するもの– Dependency Injection:依存性の注入概要コンポネント間を疎結合にできる コードがよりシンプルになるインスタンスのライフサイクル管理やインスタンス(の依存関係)の注入をコンテナが引き受ける(=プログラマが、クラスをnewしたり、setメソッドを呼び出す必要が減少)
  4. 4. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.4Context and Dependency Injection(CDI)何ができるかDI(依存性注入) インターセプトインスタンスのライフサイクル管理 EL式からのアクセスBeanBeanHTTPリクエスト
  5. 5. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.5Context and Dependency Injection(CDI) CDIはJava EE 6に準拠したアプリケーションサーバで使用可能– Oracle WebLogic Server 12c アプリケーションでCDIを有効にするには、beans.xmlが必要– WARファイルの場合「WEB-INF/beans.xml」を配置– beans.xmlは中身が空でもよい(特に記述する必要がない場合)CDIを使うには
  6. 6. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.6Context and Dependency Injection(CDI) DIの機能はJava EE 5 でも使用可能だが…Java EE 5のDI@ManagedBeanpublic class SampleMg {@EJBprivate Logic lg;}JSF EJB JPA依存関係@Statefulpublic class Logic {@PersistenceContext(unitName=“JPA”)private EntityManager em;}<?xml version="1.0"encoding="UTF-8" ?><persistence xxx><persistence-unit name=“JPA">…略プレゼンテーション層 ビジネスロジック層 データアクセス層依存関係注入する種別によってアノテーションが異なる 注入先も限定的
  7. 7. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.7Context and Dependency Injection(CDI) CDIを使用したコーディングJava EE 6のCDI@Named@RequestScopedpublic class SampleMg {@Injectprivate Logic lg;}JSF EJB JPA依存関係@Statefulpublic class Logic {@Injectprivate EntityManager em;}<?xml version="1.0"encoding="UTF-8" ?><persistence xxx><persistence-unit name=“JPA">…略プレゼンテーション層 ビジネスロジック層 データアクセス層依存関係注入する種別が異なっても@Injectで注入可能 注入先も自由
  8. 8. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.8Context and Dependency Injection(CDI) 注入先の型がインターフェースの場合実装クラスのインスタンスを生成して注入 実装クラスが複数ある場合はエラーJava EE 6のCDI:何を注入するか①public class xxBean{@Injectprivate BizLogic logic;}public class BizLogicImplimplement BizLogic {}public class xxBean{@Injectprivate BizLogic logic;}public class BizLogicImplJAPANimplement BizLogic {}public class BizLogicImplUSimplement BizLogic {}ErrorQualifierの機能を使用して適切に注入できるようになるpublic class xxBean{@JPN@Injectprivate BizLogic logic;}@JPNpublic class BizLogicImplJAPANimplement BizLogic {}注入注入解決方法例
  9. 9. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.9Context and Dependency Injection(CDI) @Producesアノテーションを使用– 動的に注入することも可能Java EE 6のCDI:何を注入するか②public class xxBean{@Injectprivate BizLogic logic;}public class BizLogicImplJAPANimplement BizLogic {}public class BizLogicImplUSimplement BizLogic {}public class HelloGenerator {@Producespublic BizLogic createBizLogic{// 条件毎に分岐if( xxx ){ return new BizLogicImplJAPAN(); }else if( yyy ){return new BizLogicImplUS(); }注入注入or
  10. 10. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.10 ビルトインのスコープ一覧Context and Dependency Injection(CDI)# 種別 概要 イメージ1 @RequestScoped 1回のHTTPリクエストの期間2 @ApplicationScoped アプリケーションの生存期間と同じ3 @SessionScoped HTTPセッションの期間4 @ConversationScoped 1回のHTTPリクエストの期間もしくは、任意の期間5 @Dependent(デフォルト)バインドされたインスタンスに依存するBeanのスコープ(1)?Webアプリケーションと同じHTTPリクエスト&レスポンス
  11. 11. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.11Context and Dependency Injection(CDI)Beanのスコープ(2)ConversationScopedpackage beans;import java.io.Serializable;import javax.enterprise.context.Conversation;importjavax.enterprise.context.ConversationScoped;import javax.inject.Inject;import javax.inject.Named;@Named@ConversationScopedpublic class ConverBean implements Serializable{@Injectprivate Conversation conversation;public void begin(){conversation.begin();}public void end(){conversation.end();}}インスタンス生成Conversation#begin()インスタンス破棄Conversation#end()Conversation#setTimeout()によるミリ秒で指定した時間の到来で破棄も可能
  12. 12. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.12Context and Dependency Injection(CDI)Beanのスコープ(3) Dependent バインド先のインスタンスのライフサイクルに合わせる– 例えば、Servletの実装クラスにBeanを注入した場合Beanのライフサイクルは、Servletのライフサイクルと同じとなるxxxServletxxxBeanxxxServlet@RequestScopedxxxBean@RequestScopedxxxBean@RequestScopedxxxBean
  13. 13. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.13Context and Dependency Injection(CDI)EL式からのアクセス JSFパッケージのManagedBeanをCDIのBeanに置き換え可能– EL式からアクセスするには、@Namedアノテーションが必要– EL式ではデフォルトでクラス名でアクセス クラス名:TestBean ⇒ EL:testBean<body><h:outputText value="#{testBean.msg}" /></body>xxxx.xhtml@RequestScopedpublic class TestBean {@Named@RequestScopedpublic class TestBean {
  14. 14. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.14CDI 1.1 New Feature(Java EE 7)
  15. 15. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.15Batch Applications for the Java PlatformJava EE 7 Release!!!(2013年6月12日)Java EE 7ConcurrencyJSON APIWebSocketJMS 2.0JAX-RS 2.0EL 3.0Expanded CDI& REST SupportBroad IndustryParticipationBuild on EE 6MomentumBatch
  16. 16. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.16
  17. 17. Copyright © 2013, Oracle and/or its affiliates. All rights reserved.17

×