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