SlideShare a Scribd company logo
ビジネスロジック層の開発
CDI & EJB
2016/02/15 JJUG ナイトセミナー
#JJUG
2016/02/15 JJUG Night Seminar #JJUG 1
羽生田 恒永
自己紹介
• 羽生田 恒永(はにゅうだ・つねなが)
• SIでの開発業を経て、ミドルウェアコンサルタントを
してます
• 白猫本 5-6章を担当
2016/02/15 JJUG Night Seminar #JJUG 2
Safe Harbor Statement
• 本資料は私個人の見解であり所属会社の見解を反映したもの
ではありません。
• 本資料の作成にあたっては正確な記述につとめましたが、内容に
対してなんら保証をするものではなく、内容に基づくいかなる運用
結果に関してもいっさいの責任を負いません。
32016/02/15 JJUG Night Seminar #JJUG
排他的な関係ではない
• 本書でCDI or EJB とか選択とか書いているので排
他的であるような印象を残してしまった部分が
あったようです
• 「で、どっちが良いの?」と聞かれることもあり
• 実際には組み合わせで解決するのが良いのかな
と思っています
42016/02/15 JJUG Night Seminar #JJUG
言い訳はここまで
No Excuse, No Life. but
52016/02/15 JJUG Night Seminar #JJUG
今日の発表
• 本の内容をまとめて発表しようかと思ったもののそ
こは読んで頂くとして
• 今日は書いてないことを中心に発表しようかと思
います
62016/02/15 JJUG Night Seminar #JJUG
白猫本に書いてあること
• CDI の使い方
– インジェクションと型解決、定義方法
– イベント処理、ステレオタイプ、プロデューサ/ディスポーザ
• EJB の使い方
– 各種EJB解説
– この先EJBまだ使って…良いんだよね?という行間
• 今日の話にEJBは出てこないです
72016/02/15 JJUG Night Seminar #JJUG
白猫本に書いてないこと
• CDI コンテナの取り扱い
• @ConversationScoped ちゃんと書け
• CDI におけるトランザクションの取り扱い
• EJB のテストのところはもうちょっと書けただろ!
82016/02/15 JJUG Night Seminar #JJUG
おさらい
Let’s Get Started
92016/02/15 JJUG Night Seminar #JJUG
おさらい::CDIとは何か
• CDI とは何か
– Contexts and Dependency Injection
– そもそもDIは「層」をくっつける接着剤
– 必要なオブジェクトを必要なタイミングで提供
2016/02/15 JJUG Night Seminar #JJUG 10
おさらい::スコープ定義
• POJOにスコープ定義さえあれば@Inject で好きな
箇所でインジェクションできる
– @RequestScoped
– @ViewScoped
– @SessionScoped
– @ApplicationScoped
– @ConversationScoped
2016/02/15 JJUG Night Seminar #JJUG 11
おさらい::例
2016/02/15 JJUG Night Seminar #JJUG 12
@Inject
MyBean bean;
@RequestScoped
public class MyBean {
…
}
サーブレット他 CDIビーン
CDI コンテナによるインスタンス化と代入
おさらい::便利
• CDIは簡単便利
• 極論するとスコープ定義さえ覚えれば使える
• EJBと比較すると実装が簡単かつリソースメリットが
ありそう
• 使いたい箇所でぱっと使ってさっとお掃除
– これが理想・・・
2016/02/15 JJUG Night Seminar #JJUG 13
おさらい::層
• 層って何
2016/02/15 JJUG Night Seminar #JJUG 14
アプリケーションサーバ
DB
Servlet
JSP
EJB
Entity
プレゼンテーション層
・画面処理
業務ロジック層
・業務処理判断
永続化層
・データ処理
Web
ブラウザ
Web
サービス
外部メッセージングサービスなど
JSF
CDI
おさらい::層
• 実際
2016/02/15 JJUG Night Seminar #JJUG 15
アプリケーションサーバ
DB
Servlet
JSP
EJB
Entity
プレゼンテーション層
・画面処理
業務ロジック層
・業務処理判断
永続化層
・データ処理
Web
ブラウザ
Web
サービス
外部メッセージングサービスなど
JSF
CDI
はじめましょう
Let’s Get Started, again
162016/02/15 JJUG Night Seminar #JJUG
白猫本に書いてないこと
• CDI コンテナの取り扱い
• @ConversationScoped
• トランザクションの取り扱い
• EJB のテスト
172016/02/15 JJUG Night Seminar #JJUG
CDIコンテナ
182016/02/15 JJUG Night Seminar #JJUG
CDIコンテナ
• よくも悪くも Weld。猫も杓子も Weld。
• 自分が開発/運用するアプリケーションサーバで採用
しているWeldのバージョンがどのバージョンなのか、くら
いは抑えておかないと死ねます
• 開発Glassfish  運用は商用サーバとか
• (感覚ですが)APサーバのバグ当たる前にWeldの
バグ当たった方が良いかもしれない、位に思っていた
方が良いと思われます
192016/02/15 JJUG Night Seminar #JJUG
CDIコンテナ
• ちなみに Glassfish と Oracle WebLogic Serverの
Weld採用バージョンはこんな感じ
Glassfish/Weld Oralce WebLogic Server/Weld
Java EE 6 3.1.2.2 / 1.1.8 12.1.2 / 1.1.10
12.1.3 / 1.1.18
Java EE 7 4.1 / 2.2.2 12.2.1 / 2.2.13
※羽生田の独自調査による 202016/02/15 JJUG Night Seminar #JJUG
CDIコンテナ
• CDIコンテナへのアクセス用API
– CDI
– CDIProvider
– BeanManager
– Extension
212016/02/15 JJUG Night Seminar #JJUG
CDI
• 取得:CDI.current();
• BeanManager の取得元として利用
– CDI.getBeanManager();
– BeanManager は @Inject で取得可能ではある
• CDI.select(MyBean.class).get(); とか
– programatic lookup!
• Since: 1.1
222016/02/15 JJUG Night Seminar #JJUG
CDI::小ネタ
• CDI.current().toString();
 “Weld” とだけ返ってきた…
(glassfish 4.1 / Weld2.2.2)
232016/02/15 JJUG Night Seminar #JJUG
CDIProvider
• CDI.current(); の裏で呼び出されるやつ
• アプリケーションサーバ側は叩かれたら
CDIProviderのインスタンスを返す必要がある
• Since: 1.1
242016/02/15 JJUG Night Seminar #JJUG
BeanManager
• Portable Extension (chapter#11)で定義されて
いる機能の担い手
• @Inject BeanManager manager;
• CDIビーンに関する拡張操作について実行可能
252016/02/15 JJUG Night Seminar #JJUG
BeanManager::例
• 特定のCDI限定子を持つCDIビーンについての情報取得例
@Inject
BeanManager manager;
…
Set<Bean<?>> beans = manager.getBeans(
Object.class, new AnnotationLiteral<OreQualifier>(){}
);
beans.forEach(
b -> log("bean:{name=" + b.getBeanClass().getCanonicalName() + "}")
);
262016/02/15 JJUG Night Seminar #JJUG
BeanManager
• 以下が可能
– コンテナ管理のCDIビーンに関する情報取得
– CDIビーンの操作(インジェクションポイント、イベント発火、コン
テキスト…etc)
• ちょこっと便利に使うのは良いけど、業務アプリケーションで
使い過ぎには注意が必要なのでは、とか思ったり
– 過度の使いすぎ  フレームワーク化  障害時に追えないと
か辛すぎる
272016/02/15 JJUG Night Seminar #JJUG
CDIコンテナ::LifeCycleEvents
• CDIコンテナ拡張機能のひとつ
• コンテナ周りの各種イベント(後述)をフックできる
• 作り方
1. javax.enterprise.inject.spi.Extension を実装するクラスを作
成する
• イベントを受け取るにはオブザーバーを使う
2. META-INF/services/javax.enterprise.inject.spi.Extension
ファイルに上記クラス名を記載
282016/02/15 JJUG Night Seminar #JJUG
CDIコンテナ::LifeCycleEvents
• 例
public class ContainerEventsExtension implements Extension {
public ContainerEventsExtension(){
log("start container extension...");
}
public void beforeBeanDiscovery(@Observes BeforeBeanDiscovery event){
log(“***EVENT***" + event.toString());
}
… }
292016/02/15 JJUG Night Seminar #JJUG
CDIコンテナ::LifeCycleEvents
• ライフサイクルイベント
– BeforeBeanDiscovery
– AfterTypeDiscovery
– AfterBeanDiscovery
– AfterDeploymentValidation
– BeforeShutdown
– ProcessAnnotatedType
– ProcessInjectionPoint
– ProcessInjectionTarget
– ProcessProducer
– ProcessBeanAttributes
– ProcessBean
– ProcessObserverMethod
 多いよ!!!
302016/02/15 JJUG Night Seminar #JJUG
CDIコンテナ::LifeCycleEvents
• 拡張機能は楽しい
• 以下の人向け
– APサーバや生コンテナに任せて居られない人
– 業務アプリで攻めたい人
• デザパタとか上に載せたくなる病の人は注意
• すみませんコンサバなもんでつい
312016/02/15 JJUG Night Seminar #JJUG
CDIコンテナ::雑感
• CDIコンテナの動き(と言うよりもCDIビーンの管理
状態遷移)は手に取るようには分からない事が
多い気がしてます
• 特に大規模開発してると勝手インジェクションとか
死ぬほどあって制御できないパターンのやつとか
• なのでCDIビーンの生き様/死に様を手に取るよう
にわかるような拡張を考えようかなと思ったり
322016/02/15 JJUG Night Seminar #JJUG
@ConversationScoped
332016/02/15 JJUG Night Seminar #JJUG
@ConversationScoped
• 自分でスコープ長を定義できる
• begin()  end() やタイムアウトで指定
• JSFとは勝手に紐づくけどそれ以外の操作(リダイ
レクトとか)には明示的にcidを用いた上で戻って
来ないと、新規のconversationとして扱われてし
まう
342016/02/15 JJUG Night Seminar #JJUG
(CDIと)トランザクション
352016/02/15 JJUG Night Seminar #JJUG
(CDIと)トランザクション
• 言い訳が思いつかない
– JTA 1.2 までやり始めると書いてて死ねる
• ので、ここで補足
362016/02/15 JJUG Night Seminar #JJUG
(CDIと)トランザクション
• JTA 1.2 (JSR-907)
• 目指せ EJB CMT からの脱却
• みんなそんなにEJBが嫌なのか!
– と思いつつもUserTransactionなんか書きたくないので、
EJBに依存することさえ無ければこいつ良いヤツなの
にって思ってるでしょ
372016/02/15 JJUG Night Seminar #JJUG
(CDIと)トランザクション::これだけ
• javax.transaction パッケージ
• @Transactional
– トランザクション境界の設定
– クラスとメソッドどちらでも
– JTA なのでCDIビーンじゃなくてもいける
• Transactional.TxType
– トランザクション属性を決める
– TransactionAttributeType と同様
382016/02/15 JJUG Night Seminar #JJUG
(CDIと)トランザクション::これだけ
• @TransactionScoped
– “現在有効なJTAトランザクション”の実行に合わせたラ
イフサイクルを持つもの
@Transactional CDI/EJB DBCDI/EJB
tx.begin();
tx.end();
@Transaction
Scoped
どちらに呼び出されてもインスタンスは同じ
※トランザクションごとに新たに作成される
392016/02/15 JJUG Night Seminar #JJUG
まとめ
wrap it up
402016/02/15 JJUG Night Seminar #JJUG
とはいえ
• EJBは時代的にアレだがCDIで何でもかんでもって設
計もどうかなって思う
– 密結合させることも必要だし悪くないのだ
– スコープ制御しきれない悪寒。というか実感。
– EJBみたいにプールが欲しい時があって本末転倒感
• EJBに任せてもいい処理があるのではないか
– でも@TransactionScopedはちょっと良いな
412016/02/15 JJUG Night Seminar #JJUG
最近はこう考えている
• CDIが本格進出してきたことでフリーダムになってしまっ
た印象
– アイツが来るまでは村は平和だったんじゃ!的な
• CDI + EJB でいいよね?
– 実際案件に触れているとそうしているお客様が増えてきて
いる気がする
– 悩んでいるところには悩まないように簡素に実装できるとい
う意味で推し
422016/02/15 JJUG Night Seminar #JJUG
この領域の残念なところ
• フリーダム
• アンチパターンが多くない(ので集めたい)
– 使いすぎ良くない、程度
• 本編で少し触れましたが多量のインジェクションは止めましょう
– 2回ほど見かけました。Oracle WebLogic Server が死にかけてた
– 大規模開発現場での設計者が意図しないインジェクション数
– かといってフレームワークで制御ってのも
– 設計でカバー?うーん…
432016/02/15 JJUG Night Seminar #JJUG
感想など
• 書けていないこと沢山ありました
• ちょくちょくどこかで追撃できればと思います
• 振り返れば楽しかったです
442016/02/15 JJUG Night Seminar #JJUG

More Related Content

PPTX
ついに始まるJava EE 7時代のアプリケーション開発
PDF
イエラエセキュリティMeet up 20210820
PDF
Jakarta CDI 4.0
PDF
Amazon Connect ハンズオン初級編
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PDF
データローダについてちょっと詳しくなる
PPTX
SCUGJ第27回勉強会:ものすごくざっくりなAzure Filesの話
PDF
BuildKitの概要と最近の機能
ついに始まるJava EE 7時代のアプリケーション開発
イエラエセキュリティMeet up 20210820
Jakarta CDI 4.0
Amazon Connect ハンズオン初級編
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
データローダについてちょっと詳しくなる
SCUGJ第27回勉強会:ものすごくざっくりなAzure Filesの話
BuildKitの概要と最近の機能

What's hot (20)

PPTX
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
PDF
Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~
PDF
「これからはじめるNGINX技術解説~基本編」セミナー (NGINX Back to Basic in JP)
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PPTX
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
PDF
JVMのGCアルゴリズムとチューニング
PDF
Javaのログ出力: 道具と考え方
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
PDF
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
Jbatch実践入門 #jdt2015
PDF
脆弱性診断とはなんぞや
PPTX
クラウドでも非機能要求グレードは必要だよね
PDF
俺のサイジング
PDF
オープンソースのAPIゲートウェイ Kong ご紹介
PDF
Windows Server 2019 で Container を使ってみる
PDF
【Oracle Cloud ウェビナー】WebLogic Serverのご紹介
PDF
Inside vacuum - 第一回PostgreSQLプレ勉強会
PDF
Dockerを利用したローカル環境から本番環境までの構築設計
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~
「これからはじめるNGINX技術解説~基本編」セミナー (NGINX Back to Basic in JP)
Javaはどのように動くのか~スライドでわかるJVMの仕組み
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
JVMのGCアルゴリズムとチューニング
Javaのログ出力: 道具と考え方
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
ドメイン駆動設計のための Spring の上手な使い方
Jbatch実践入門 #jdt2015
脆弱性診断とはなんぞや
クラウドでも非機能要求グレードは必要だよね
俺のサイジング
オープンソースのAPIゲートウェイ Kong ご紹介
Windows Server 2019 で Container を使ってみる
【Oracle Cloud ウェビナー】WebLogic Serverのご紹介
Inside vacuum - 第一回PostgreSQLプレ勉強会
Dockerを利用したローカル環境から本番環境までの構築設計
Ad

Viewers also liked (13)

PDF
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
PDF
20160215 04 java ee7徹底入門 jbatch
PDF
Java EE 再入門
PDF
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
PDF
EJB3 ABC
PDF
JSR 352 “Batch Applications for the Java Platform”
PDF
Wicket + EJB3 on JBoss (Japanese)
PDF
BTS/ITSの近況とあれこれ 2015
PDF
JavaOne 2014 BOF4241 What's Next for JSF?
PDF
What's next for Java API for WebSocket (JSR 356)
PPTX
開発環境の認証を改善して Redmineを社内標準にした話
PDF
クロスプラットフォーム開発入門
PDF
CON5898 What Servlet 4.0 Means To You
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
20160215 04 java ee7徹底入門 jbatch
Java EE 再入門
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
EJB3 ABC
JSR 352 “Batch Applications for the Java Platform”
Wicket + EJB3 on JBoss (Japanese)
BTS/ITSの近況とあれこれ 2015
JavaOne 2014 BOF4241 What's Next for JSF?
What's next for Java API for WebSocket (JSR 356)
開発環境の認証を改善して Redmineを社内標準にした話
クロスプラットフォーム開発入門
CON5898 What Servlet 4.0 Means To You
Ad

Similar to 3.Java EE7 徹底入門 CDI&EJB (20)

PDF
Windows Azure Bootcamp メディアサービス編
PDF
Pivotal Trackerでアジャイルなプロジェクト管理
PDF
アジャイルマネジメントとマインドセット 〜ヒーローを待っていても世界は変わらない〜
PDF
決済システム内製化に向けたプラットフォーム構築 - PCF・BOSHによるオブザーバブルプラットフォーム
PDF
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
PDF
タイムボックス制約付きインクリメンタル開発
PPTX
さくっと理解するSpring bootの仕組み
PDF
Decode2017を振り返りアップデート情報チョット見せ
PDF
【Unite Tokyo 2018】非プログラマでもできる!簡単プロジェクト管理&マネタイゼーション術!
PPTX
誰にでもできるパフォーマンスチューニング
PDF
地図を捨ててコンパスを頼りに進め
PDF
地図を捨ててコンパスを頼りに進め
PPTX
分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
PDF
220523JS7.pdf
PDF
GC_Naiseika_Day_q3_0706_Keynote.pdf
PPTX
SCUGJ第28回勉強会:Azure Extended Network Ver 2.2.0 Update
PPTX
SCUGJ第25回勉強会:Azure Site Recoveryでハマった with VMware 環境
PDF
運用の現場での監視運用ツールの活用
PDF
ユーザー企業における標準化のあり方 : QCon Tokyo 2010
PPTX
SCUGJ第29回勉強会:Introducing Azure Arc enabled VMware vSphere
Windows Azure Bootcamp メディアサービス編
Pivotal Trackerでアジャイルなプロジェクト管理
アジャイルマネジメントとマインドセット 〜ヒーローを待っていても世界は変わらない〜
決済システム内製化に向けたプラットフォーム構築 - PCF・BOSHによるオブザーバブルプラットフォーム
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
タイムボックス制約付きインクリメンタル開発
さくっと理解するSpring bootの仕組み
Decode2017を振り返りアップデート情報チョット見せ
【Unite Tokyo 2018】非プログラマでもできる!簡単プロジェクト管理&マネタイゼーション術!
誰にでもできるパフォーマンスチューニング
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め
分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
220523JS7.pdf
GC_Naiseika_Day_q3_0706_Keynote.pdf
SCUGJ第28回勉強会:Azure Extended Network Ver 2.2.0 Update
SCUGJ第25回勉強会:Azure Site Recoveryでハマった with VMware 環境
運用の現場での監視運用ツールの活用
ユーザー企業における標準化のあり方 : QCon Tokyo 2010
SCUGJ第29回勉強会:Introducing Azure Arc enabled VMware vSphere

3.Java EE7 徹底入門 CDI&EJB