パーフェクト Java EE

パーフェクト Java EE

パーフェクト Java EE

  • DIの使い所
    • DIが有効なケース
      • Webアプリケーションのレイヤ間接続(Controller - Service - DAO の接続)
      • 外部リソースに依存するクラスへの接続
      • ストラテジパターンによるアプリケーションの拡張ポイントの依存性解決
      • インターフェースと実装クラスを分離するために、Factoryクラスを生成している場合
    • new演算子が有効なケース
      • システムで管理するデータとなるインスタンスを生成する処理
      • JPAエンティティの新規作成
      • アプリケーションの同一レイア内のクラス間依存性解決
  • CDIのインジェクトポイント
    • フィールド、コンストラクタ、セッター
      • イミュータブルを実現できるのはコンストラクタ
      • ユニットテスト時の容易さはフィールド
  • @Typed でインジェクトポイントに利用可能な型を絞り込む事が可能
  • インターフェースの実装クラスが複数ある場合は、@Qualifier を使用する
  • @Named を限定子として利用するのは非推奨あくまでもView側EL式参照のため
    • デフォルトでクラス名の先頭を小文字にした名前がBean名になる
  • プロデューサメソッドに付与する @Produces 動的に依存性を解決する
  • ディスポーザメソッド @Disposes
  • CDIに含まれるスコープ
    • @RequestScoped
    • @SessionScoped
    • @ApplicationScoped
    • @ConversationScoped
    • @Dependent
    • @Singleton(使うメリットがない @ApplicationScoped を使う)
  • ライフサイクルコールバックメソッド
    1. コンストラクタの実行
    2. DIの解決。@Inject適用ポイントへのインジェクト
    3. @PostConstructメソッドの実行
    4. スコープ定義に応じた生存期間
    5. @PreDestoryメソッドの実行
    6. インスタンス破棄によりGC対象へ
  • ステレオタイプ CDIに関するアノテーションをグループ化する仕組み @Stereotype
    • @Model = @Named + @RequestScoped
  • インターセプタ
  • プリミティブ型や配列型、総称型のインジェクト
    • @Inject と 限定子 @Config(独自アノテーション) の組み合わせによって propertiesファイルより値を設定できる
  • @Alternativeによる代替Beanのインジェクト
    • 環境に応じて作成する war アーカイブをわけるのに便利
    • beans.xmlを記載する必要がある
  • @Interceptors シンプルな実装を優先したい場合
  • @InterceptorBinding 疎結合でより直感的なコード表現を優先したい場合
  • @Decorator
    • @Priority, beans.xml などで優先度を制御
  • CDIイベント
    • イベントオブジェクト
      • @Observes, Eventクラス(@Injectする)
        • 向き
          • 特定のイベント発生に伴い、順序性を持たない処理を実行する機能
          • 特定のイベント発生に伴い、複数CDI管理Bean間の状態を更新したい機能
        • 不向き
          • 処理の順序性を持つ機能
          • 拡張の可能性が少ない機能
    • オブザーバ(@Observes)
    • プロデューサ(Eventインターフェース)
  • WEB-INFとMETA-INFディレクト
    • WEB-INF web.xml、クラスファイル、jarファイル
    • META-INF コンテナ固有の設定ファイル
  • REST HTTP Method
    • GET/article/1 リソースの取得
    • POST/article/ リソースの新規作成
    • PUT/article/1 指定URLのリソースの新規作成もしくは更新
    • DELETE/article/1 リソースの削除
  • リソースクラスはエントリポイントとになるので状態を持たない → @ApplicationScoped を付与しても良いのではないか
  • リソースクラスの例外とExceptionMapper
  • フォームビーン
    • @BeanParam
    • @Consumes POSTデータの形式を指定(JSON, XML, など)
  • Responseオブジェクト
    • Response.ok(html).build();
  • JSTL
    • コア c 制御構文などの基本的な機能
    • 書式 fmt 日付や数値の書式化機能
    • SQL sql SQLの実行機能
    • XML x XMLの操作機能
    • 関数 fn 関数ライブラリ
  • WebSocket
    • ws:// or wss:// ではじまり JavaScriptでコードを書いて実現している
    • 1つのクライアントごとに1つのEndPointオブジェクトが生成される(同期処理は考慮不要)
  • JSF(思想はMVC、MVを実装)
    • タグ
      • HTML h:
      • Core f:
      • Facelets ui:
      • Composite Component cc:
      • Pass-through Elements jsf:
      • Pass-through Attributes p:
      • JSTL Core c:
      • JSTL Function fn:
  • リソース CSS, JavaScript は resourcesフォルダに配置する
    • <h:outputStylesheet library="css" name="common.css">
    • <h:outputScript library="js" name="common.js">
    • <h:graphicImage library="image" name="PerfectJavaEE.jpg">
  • リロースのバージョン管理 JSFによって自動的に最新バージョンが適用される
  • 管理Bean
    • @RequestScoped
    • @ViewScoped
    • @SessionScoped
    • @ConversationScoped
    • @FlowScoped
    • @ApplicationScoped
    • @Dependent
  • パラメータの渡し方
    • クエリ文字列
      • 同時にアクション実行
  • JSF 応用
    • Ajax
    • バリデータ
    • 複数コンポーネント
    • リッチコンポーネントライブラリ
      • RichFaces, IceFaces, PrimeFaces(人気)
    • サポートライブラリ
      • OmniFaces
      • PrettyFaces
    • その他
      • パフォーマンス
        • Project Stage(開発 Development, 本番 Production), Skip Comments(true), Refresh Period(本番 -1)
  • Validation
    • Messages_jp.properties
    • Object graph validation 子オブジェクトを制約対象にする
    • Constraint Composition 制約をまとめる
  • JPAの構成要素
    • エンティティ
      • Serializable
      • 主キー設定 IDENTIFY, SEQUENCE, TABLE, AUTO(デフォルト)
      • 複合キー @EmbeddedId, @Embeddable
      • エンティティリスナー
      • 関連エンティティのイベントの伝播 @OneToOne(cascade = CascadeType.ALL)
      • Criteria Query
    • EntityManager Metamodel
      • ライフサイクル(超重要)
        • コールバック
    • 永続性コンテキスト
    • EntityManagerFactory(SEで使用)
    • 永続性ユニット(META-INF/persistence.xml
      • presistence-unit name属性に永続性ユニット名(必須)とトランザクションの種類(オプション)を設定
      • jta-data-source トランザクションJTAの場合、データソースのJNDI名を設定
      • execlude-unlisted-classes 読み込むEntityの列挙、falseの場合は、@Entityのついたクラスを読み込む
      • DLL/スキーマ作成
  • EJB
    • セッションBean(Transactionalが付与されたCDI管理Beanと同様の宣言的トランザクションがデフォルトで有効)
      • ステートレスセッションBean @Stateless
      • ステートフルセッションBean @Stateful
      • シングルトンセッションBean @Singleton
  • EJBタイマーサービス
    • @Schedule あまり実用的ではない
機能 CDI EJB
@InjectによるDI
インターセプタの適用
宣言的トランザクション
@NamedによるEL式連携
スコープ ×
@Startupによるデプロイ時初期化 ×
タイマーサービス ×
非同期メソッド実行 ×
リモート呼び出し ×
メソッドへの認証・許可設定 ×
メッセージ駆動Bean ×