3.Java EE7 徹底入門 CDI&EJB

44
ビビビビビビビビビビビビ CDI & EJB 2016/02/15 JJUG ナナナナナナナ #JJUG 2016/02/15 JJUG Night Seminar #JJUG 1 ナナナ ナナ

Transcript of 3.Java EE7 徹底入門 CDI&EJB

Page 1: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 1

ビジネスロジック層の開発CDI & EJB2016/02/15 JJUG ナイトセミナー#JJUG

羽生田 恒永

Page 2: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 2

自己紹介• 羽生田 恒永(はにゅうだ・つねなが)• SI での開発業を経て、ミドルウェアコン

サルタントをしてます• 白猫本 5-6 章を担当

Page 3: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 3

Safe Harbor Statement• 本資料は私個人の見解であり所属会社の見解を反映した

ものではありません。• 本資料の作成にあたっては正確な記述につとめました

が、内容に対してなんら保証をするものではなく、内容に基づくいかなる運用結果に関してもいっさいの責任を負いません。

Page 4: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 4

排他的な関係ではない• 本書で CDI or EJB とか選択とか書いているの

で排他的であるような印象を残してしまった部分があったようです

• 「で、どっちが良いの?」と聞かれることもあり

• 実際には組み合わせで解決するのが良いのかなと思っています

Page 5: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG

言い訳はここまでNo Excuse, No Life. but

5

Page 6: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 6

今日の発表• 本の内容をまとめて発表しようかと思っ

たもののそこは読んで頂くとして• 今日は書いてないことを中心に発表しよ

うかと思います

Page 7: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 7

白猫本に書いてあること• CDI の使い方– インジェクションと型解決、定義方法– イベント処理、ステレオタイプ、プロデューサ /

ディスポーザ• EJB の使い方– 各種 EJB 解説– この先 EJB まだ使って…良いんだよね?という行間

• 今日の話に EJB は出てこないです

Page 8: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 8

白猫本に書いてないこと• CDI コンテナの取り扱い• @ConversationScoped ちゃんと書け• CDI におけるトランザクションの取り扱

い• EJB のテストのところはもうちょっと書

けただろ!

Page 9: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG

おさらいLet’s Get Started

9

Page 10: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 10

おさらい ::CDI とは何か• CDI とは何か– Contexts and Dependency Injection–そもそも DI は「層」をくっつける接着剤–必要なオブジェクトを必要なタイミングで提

Page 11: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 11

おさらい :: スコープ定義• POJO にスコープ定義さえあれば @Inject で

好きな箇所でインジェクションできる– @RequestScoped– @ViewScoped– @SessionScoped– @ApplicationScoped– @ConversationScoped

Page 12: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 12

おさらい :: 例

@InjectMyBean bean;

@RequestScopedpublic class MyBean {…}

サーブレット他 CDI ビーン

CDI コンテナによるインスタンス化と代入

Page 13: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 13

おさらい :: 便利• CDI は簡単便利• 極論するとスコープ定義さえ覚えれば使

える• EJB と比較すると実装が簡単かつリソース

メリットがありそう• 使いたい箇所でぱっと使ってさっとお掃

除–これが理想・・・

Page 14: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 14

おさらい :: 層• 層って何

アプリケーションサーバ

DB

ServletJSP

EJB

Entity

プレゼンテーション層・画面処理

業務ロジック層・業務処理判断

永続化層・データ処理

Webブラウザ

Webサービス

外部メッセージングサービスなど

JSF

CDI

Page 15: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 15

おさらい :: 層• 実際

アプリケーションサーバ

DB

ServletJSP

EJB

Entity

プレゼンテーション層・画面処理

業務ロジック層・業務処理判断

永続化層・データ処理

Webブラウザ

Webサービス

外部メッセージングサービスなど

JSFCDI

Page 16: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG

はじめましょうLet’s Get Started, again

16

Page 17: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 17

白猫本に書いてないこと• CDI コンテナの取り扱い• @ConversationScoped• トランザクションの取り扱い• EJB のテスト

Page 18: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG

CDI コンテナ

18

Page 19: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 19

CDI コンテナ• よくも悪くも Weld 。猫も杓子も Weld 。• 自分が開発 / 運用するアプリケーションサーバで採用

している Weld のバージョンがどのバージョンなのか、くらいは抑えておかないと死ねます

• 開発 Glassfish 運用は商用サーバとか• (感覚ですが) AP サーバのバグ当たる前に Weld のバ

グ当たった方が良いかもしれない、位に思っていた方が良いと思われます

Page 20: 3.Java EE7 徹底入門 CDI&EJB

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

※ 羽生田の独自調査による

Page 21: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 21

CDI コンテナ• CDI コンテナへのアクセス用 API– CDI– CDIProvider– BeanManager– Extension

Page 22: 3.Java EE7 徹底入門 CDI&EJB

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

Page 23: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 23

CDI:: 小ネタ• CDI.current().toString();

“Weld” とだけ返ってきた…(glassfish 4.1 / Weld2.2.2)

Page 24: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 24

CDIProvider• CDI.current(); の裏で呼び出されるやつ• アプリケーションサーバ側は叩かれたら

CDIProvider のインスタンスを返す必要がある

• Since: 1.1

Page 25: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 25

BeanManager• Portable Extension (chapter#11) で定義され

ている機能の担い手• @Inject BeanManager manager;• CDI ビーンに関する拡張操作について実行

可能

Page 26: 3.Java EE7 徹底入門 CDI&EJB

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() + "}"));

Page 27: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 27

BeanManager• 以下が可能

– コンテナ管理の CDI ビーンに関する情報取得– CDI ビーンの操作(インジェクションポイント、イベント発

火、コンテキスト… etc )• ちょこっと便利に使うのは良いけど、業務アプリケー

ションで使い過ぎには注意が必要なのでは、とか思ったり– 過度の使いすぎ フレームワーク化 障害時に追えないとか

辛すぎる

Page 28: 3.Java EE7 徹底入門 CDI&EJB

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 ファイルに上記クラス名を記載

Page 29: 3.Java EE7 徹底入門 CDI&EJB

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()); }… }

Page 30: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG

CDI コンテナ ::LifeCycleEvents• ライフサイクルイベント

– BeforeBeanDiscovery– AfterTypeDiscovery– AfterBeanDiscovery– AfterDeploymentValidation– BeforeShutdown– ProcessAnnotatedType– ProcessInjectionPoint– ProcessInjectionTarget– ProcessProducer– ProcessBeanAttributes– ProcessBean– ProcessObserverMethod

多いよ!!!

30

Page 31: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 31

CDI コンテナ ::LifeCycleEvents• 拡張機能は楽しい• 以下の人向け– AP サーバや生コンテナに任せて居られない人–業務アプリで攻めたい人

• デザパタとか上に載せたくなる病の人は注意• すみませんコンサバなもんでつい

Page 32: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 32

CDI コンテナ :: 雑感• CDI コンテナの動き(と言うよりも CDI ビーンの管

理状態遷移)は手に取るようには分からない事が多い気がしてます

• 特に大規模開発してると勝手インジェクションとか死ぬほどあって制御できないパターンのやつとか

• なので CDI ビーンの生き様 / 死に様を手に取るようにわかるような拡張を考えようかなと思ったり

Page 33: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG

@ConversationScoped

33

Page 34: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 34

@ConversationScoped• 自分でスコープ長を定義できる• begin() end() やタイムアウトで指定• JSF とは勝手に紐づくけどそれ以外の操作

(リダイレクトとか)には明示的に cid を用いた上で戻って来ないと、新規のconversation として扱われてしまう

Page 35: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG

(CDI と ) トランザクション

35

Page 36: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 36

(CDI と ) トランザクション• 言い訳が思いつかない– JTA 1.2 までやり始めると書いてて死ねる

• ので、ここで補足

Page 37: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 37

(CDI と ) トランザクション• JTA 1.2 (JSR-907)• 目指せ EJB CMT からの脱却• みんなそんなに EJB が嫌なのか!–と思いつつも UserTransaction なんか書きたく

ないので、 EJB に依存することさえ無ければこいつ良いヤツなのにって思ってるでしょ

Page 38: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 38

(CDI と ) トランザクション :: これだけ

• javax.transaction パッケージ• @Transactional– トランザクション境界の設定– クラスとメソッドどちらでも– JTA なので CDI ビーンじゃなくてもいける

• Transactional.TxType– トランザクション属性を決める– TransactionAttributeType と同様

Page 39: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 39

(CDI と ) トランザクション :: これだけ• @TransactionScoped– “ 現在有効な JTA トランザクション”の実行に

合わせたライフサイクルを持つもの@Transactional CDI/EJB DBCDI/EJB

tx.begin();

tx.end();

@TransactionScoped

どちらに呼び出されてもインスタンスは同じ※ トランザクションごとに新たに作成される

Page 40: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG

まとめwrap it up

40

Page 41: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 41

とはいえ• EJB は時代的にアレだが CDI で何でもかんで

もって設計もどうかなって思う– 密結合させることも必要だし悪くないのだ– スコープ制御しきれない悪寒。というか実感。– EJB みたいにプールが欲しい時があって本末転倒感

• EJB に任せてもいい処理があるのではないか– でも @TransactionScoped はちょっと良いな

Page 42: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 42

最近はこう考えている• CDI が本格進出してきたことでフリーダムになっ

てしまった印象– アイツが来るまでは村は平和だったんじゃ!的な

• CDI + EJB でいいよね?– 実際案件に触れているとそうしているお客様が増えて

きている気がする– 悩んでいるところには悩まないように簡素に実装でき

るという意味で推し

Page 43: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 43

この領域の残念なところ• フリーダム• アンチパターンが多くない(ので集めたい)

– 使いすぎ良くない、程度• 本編で少し触れましたが多量のインジェクションは止めま

しょう– 2 回ほど見かけました。 Oracle WebLogic Server が死にかけてた– 大規模開発現場での設計者が意図しないインジェクション数– かといってフレームワークで制御ってのも– 設計でカバー?うーん…

Page 44: 3.Java EE7 徹底入門 CDI&EJB

2016/02/15 JJUG Night Seminar #JJUG 44

感想など• 書けていないこと沢山ありました• ちょくちょくどこかで追撃できればと思

います• 振り返れば楽しかったです