狠狠撸

狠狠撸Share 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

3.Java EE7 徹底入門 CDI&EJB