CDI を乗りこなせ!
JBoss Seam 3 と Seam Forge

                                    Red Hat
       Senior Software Maintenance Engineer
                           Takayoshi Kimura
CDI

• JSR-299 Contexts and Depenency
  Injection
• CDI の概要とか基本的な利用方法など
  についてはこのスライドでは触れませ
  ん
 – 皆本さんが CDI や Seam 3 の記事を書い
   ているのでそちらを参照してください
 – http://thinkit.co.jp/book/2011/03/03/2031
Weld

• JSR-299 CDI Reference
  Implementation
  – 参照実装
Portable Extension

• CDI の目玉機能の一つ
• この機能を利用して Java EE の拡張を
  実装可能
• Seam 3 もいくつかの Portable
  Extension の集まり
• 簡単に作れる
簡単に作れる?
• Java クラスを作る
• Extension を登録する
• jar にしてデプロイする
Java クラスを作る
package com.acme;

import javax.enterprise.inject.spi.Extension;

public class MyExtension implements Extension {
}
Extension を登録する
• jar の META-INF/services というディレ
  クトリに以下のファイルを作成
  – javax.enterprise.inject.spi.Extension
  – 中身は先ほど作ったクラス名
  – 複数ある場合は複数行記述すれば良い


org.acme.MyExtension
Seam 3
History

• Seam 3.0.0.Final
  – 2011 年 3 月
• Seam 2.0.0.GA
  – 2007 年 12 月
• Seam 1.0.0.GA
  – 2006 年 6 月
• Seam 1.0.0.Beta1
  – 2005 年 9 月
Seam Catch

• 例外ハンドリングを提供
@HandlesExceptions
public class MyHandler {
  void printExceptions(
    @Handles CaughtException<Throwable> ev) {

        ev.getException().printStackTrace();
        ev.markHandled();

    }
}
Seam Catch

• Extension のソースを見てみよう
Seam Faces

• JSF オブジェクトの提供
  – FacesContext
  – ExternalContext,
  – NavigationHandler
  – Flash
public class Bean {
  @Inject FacesContext context;
}
Seam Faces

• JSF のフェーズコールバック
public void observeRenderResponse(
  @Observes @Before @RenderResponse
  PhaseEvent e) {
  // Do something with the event object
}
Seam International

• ロカールやタイムゾーンの提供
@Inject
java.util.Locale defaultLocale;

@Inject
@UserLocale
java.util.Locale userLocale;
Seam International

• 国際化されたメッセージ
@Inject
Messages messages;

public void addLoginMessage() {
  messages.info("Welcome {0}!", user.getName());
}
public void addLoginMessageFromResourceBundle() {
  messages.info(
    new BundleKey("myapp", "login.welcome"),
    user.getName());
}
Seam Solder

• Solder = ソルダー = はんだづけ
• 汎用性の高いコンポーネントやアノテ
  ーションの提供
Seam Solder

• EL の実行
@Inject Expressions expressions;

public void run() {
  String fruitName =
    expressions.evaluateValueExpression(
      "#{fruitBowl.fruitName}", String.class);
  Apple fruit =
    expressions.evaluateMethodExpression(
      "#{fruitBowl.getFruit}", Apple.class);
}
Seam Solder

• リソース読み込み
@Inject
@Resource("WEB-INF/web.xml")
InputStream webXml;

@Inject
@Resource("META-INF/aws.properties")
Properties awsProperties;
Seam Solder

• Logger
@Inject Logger log;
他にもいっぱい
•   Seam Security
•   Seam Remoting
•   Seam REST
•   Seam Persistence and Transactions
•   Seam Validation
•   Seam Wicket
•   Seam Servlet
Seam 3.1

•   Seam Social
•   Seam Flex
•   Seam Compatibility Module
•   Seam JMS
•   Seam Mail
•   Seam Cron
•   Seam Reports
Seam Forge
Seam Forge

• forge
    – 鍛冶場
•   ラピッドデベロップメント環境
•   シェル
•   テクノロジインテグレーション
•   スクリプティング
テクノロジの選択
• maven-archetype-plugin
  – 最初の一発のみ
  – A と C と D と X を使いたい
    • ダイアモンド継承問題と同じ状態に
• 継続テクノロジインテグレーション
  – いつでも追加
  – git との連携
  – 追加したもののロールバック ( 実装予定 )
テクノロジの選択
• デモ
 – プロジェクト作成
 – テクノロジ追加
 – プラグイン追加
• 時間があれば
 – scaffold による Web アプリ生成
Seam Forge

• まだアルファ版です
 – 本当にアルファ版です
 – 開発が活発すぎて整合性の取れていない状
   態のものがあり、かなり多くのものが動
   かないです
 – JBoss AS7 版が本命ですがまだちゃんと
   動きません
CDI, Seam 3 and Forge

CDI, Seam 3 and Forge