CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。
![CDIを利用したサンプルアプリーケションの作成](https://cdn-ak-scissors.b.st-hatena.com/image/square/c34299ff659dc53762faa30add208fefff3c682c/height=288;version=1;width=512/https%3A%2F%2Fcodezine.jp%2Fstatic%2Fimages%2Farticle%2F6593%2F6593_arena.png)
2011年8月19日金曜日 CDIコンテナイベントの分類 CDIコンテナのライフサイクルイベントを表1にまとめてみました。 私はこれらのイベントはフェーズや用途によって以下のグループに分けられると思います(今後、CDIを使いこなしていくうちにもっと用途を細かく追記できるでしょうが、まずはここからスタートします)。 A) コンテナのライフサイクルフェーズごとに送信されるもの A-1) コンテナへの各種情報の登録 BeforeBeanDiscovery AfterBeanDiscovery A-2) 拡張モジュールの初期化と終了処理 AfterDeploymentValidation BeforeShutdown B) コンテナがアーカイブ中のBeanをスキャン中に送信されるもの B-1) コンテナが管理するメタモデルを置き換え/上書きする ProcessAnnotatedType Pro
CDIではフィールドを直接参照してはいけない をみるとタイトルからCDIではまったくpublicフィールド触ってはいけないように感じてしまう。 実際はそんなことはない。 依存スコープのBeanなら直接参照してよい。 依存スコープというのは注入先のスコープに合わせるということ。プロキシ等を通さずインスタンスが生成されてそのまま入る。Springでいうところのプロトタイプということで一番単純なDIともいえる。 そして依存スコープ以外でpublicフィールドを持っているCDI管理下のビーンを作成すると、デプロイ時にはねられる。 つまりあのきしださんの例はパッケージプライベートを利用したときのみチェックにも引っかからず予想しない動きが発生するわけだ。すべてを同一パッケージにおくとは考えにくいこと、publicフィールドだとデプロイすらできないことを考えるとはまるほうが珍しいと考えることができる。
ちょっとハマったので、メモ こんなSessionScopedなクラスを作ります。 import java.io.Serializable; import javax.annotation.PostConstruct; import javax.enterprise.context.SessionScoped; import javax.inject.Named; @Named @SessionScoped public class MySession implements Serializable{ long id; @PostConstruct void init(){ System.out.println("init my session"); } } そんでもって、こんなサーブレットから使ってみます。 @WebServlet(name = "MyServlet", urlPatter
もっとJavaEE6っぽくやってみよう 昨日のエントリでは、AsyncContextの使いかたを試すため、サーブレットだけを使って実装してみました。 でも、すこし泥臭いコードも多くなっていたし、このまま実用的なコードにしていくときにゴテゴテとコードを継ぎ足していくというのもイヤな感じです。 そこで、もっとJavaEE6っぽいコードに書き換えてみましょう。 少し準備 今回は、JAX-RSでのRESTful Webサービスと、CDIでのインジェクションを使ってみます。 JAX-RSの準備 まずは、JAX-RSを使うための設定クラスを作成します。 package chat2; @javax.ws.rs.ApplicationPath("rs") public class ApplicationConfig extends javax.ws.rs.core.Application { } こういう
連載の第2回となる今回は、Seam3の土台となるCDI (Contexts and Dependency Injection) の基本を確認します。SeamFramework.orgではCDI仕様の参照実装Weldを開発しています。今回はJBossアプリケーションサーバー(JBossAS)上でWeldのサンプル動作させてみましょう。 CDI サンプルプログラムの実行 開発環境の準備 CDIのプログラミングを試すためには、以下の開発環境を準備してください。 JDK 1.6 Ant 1.8 JBoss AS 6.0.0.Final (jboss-as-distribution-6.0.0.Final.zip) Weld 1.10.GA (weld-1.1.0-Final.zip) JDKはバージョン1.6以降が必要です。JBossAS 6はJBoss.orgからダウンロードします。Weld は
JavaEE 6標準は、従来のJavaEE 5に対してさらなるEoDと軽量化を目指しているということだったのですが、いざ使おうと思うと、名前が同じアノテーションが複数のパッケージに定義されていたり、意味的にほとんど違いがないようなアノテーションが存在していたりで、初心者はもちろんのこと、ある程度ベテラン開発者であってもどう使い分けてよいものか途方にくれてしまいます。仕様は多数の人間の決めることですから、ある程度機能的な重複や矛盾があることは避けられないことですが、それでも、特にDIやEJB、管理Bean関係のAPIに対する機能重複についてはかつて経験したことがない程ひどく、これで本当にfinalの状態なのかと信じられないくらいです。さまざまなアイデアを取り込むのは大歓迎ですが、かつて仕様に統一感があった(仕様自体はまったく使い物になりませんでしたが)EJB2.1のころの時代が逆に懐かしく感
そういやいっちばん基本的なことだったのに書いてなかったな。 コンバータは以前書いたのでバリデータも同様に作ることができる。 でも、ここはJSFのバリデータを呼ぶのではなく、Java EE 6らしくバリデーションも標準化されたBeanValidationを利用したい。BeanValidationはJavaSE単体でも使えるし、JPA 2.0やSpring Framework 3、もちろんRIであるHibernateでも利用できる。いまや標準的なバリデーション機能となった。覚えておいて損はあるまい。 というわけで今回はJSF2 + BeanValidationの組み合わせで入力検証を行う。過去のJSFとBean Validationのエントリをあわせればいいだけだけれども。 javaコード package jsf; import javax.faces.bean.ManagedBean; im
来年も作りたい!ふきのとう料理を満喫した 2024年春の記録 春は自炊が楽しい季節 1年の中で最も自炊が楽しい季節は春だと思う。スーパーの棚にやわらかな色合いの野菜が並ぶと自然とこころが弾む。 中でもときめくのは山菜だ。早いと2月下旬ごろから並び始めるそれは、タラの芽、ふきのとうと続き、桜の頃にはうるい、ウド、こ…
2019年12月(1) 2017年12月(2) 2016年12月(1) 2015年12月(1) 2015年11月(1) 2014年12月(6) 2012年12月(1) 2012年09月(1) 2012年03月(1) 2011年12月(3) 2011年10月(1) 2011年09月(1) 2011年07月(1) 2011年05月(2) 2011年04月(1) 2011年02月(2) 2010年12月(2) 2010年11月(1) 2010年10月(3) 2010年09月(7)
今まではJSFを利用していない限りJSPやXHTMLの補完はきかなかった。 ツールでELの補完がきかないのはバグを生む原因になり最悪だと思っているのでJSFをよく利用していたが、これからはJSPだけでも安心して使えるようだ。そしてVelocityなどのテンプレートエンジンはますます立場が悪くなっていきますね。 というわけで以下例をのせてみます。 まず配置。依存ライブラリはありません。JSP1つとクラス1つです。beans.xmlは中身空っぽで。 sun-web.xmlがありますが、これは無視してください。消しても良いです。 続いてクラスの中身。これですべてです。標準APIのCDIで記述しています。一般常識なので問題は無いですね。 package hoge; import java.io.Serializable; import javax.enterprise.context.Sessio
NetBeans 6.9 RC2がでたようなので落とす。今回もほぼ日本語化されてますね。 http://www.linux-foundation.jp/content/2009osstools にて、NetBeansが2008年では「導入実績あり」から、2009年Eclipseと同様の「導入実績多数」に昇格したというのはこの辺が関係あるきがします。 今回はCDIまわりについて。 CDIを有効にした状態でプロジェクトを作成し、JSFの管理Beanを新規作成するとできあがるのはJSFのManaged Beanではなく、CDIのクラスが生成される。ちょっとびびった。 だが、驚くのはそんなところではない。 まず以下のようなコードを書く。足し算をするクラスですね。 package bean; import javax.inject.Named; import javax.enterprise.con
JNDIをJ2EEサーバ無しでかつテスト用ライブラリも無しでテストする場合、InitialContextに自前でbindしてlookupします。 @BeforeClassだったり、setUpメソッドで以下のようにbindすると良いでしょう。 この例では、T2でCDIの単体テストを行う時に利用しています。 System.out.println("CdiTestCase#setUp"); System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory"); System.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.weld.resources.ManagerObjectFactory"); ic = new I
Glassfish V3にて確認した。 問題なし。 問題なく使用できたT2のバージョンは t2-0.6.3-20100202.022748-16.jar で、ちょっと前の t2-0.6.3-20100201.091209-13.jar ではダメだった。 ただし、T2のログとNetBeansの相性の悪さでT2の動作が異様に遅いのがちとつらいけど。 Adapter含めてコードは前と同じ。 一応コード全部載せる。 リクエストスコープフォーム格納用。 package t2cdi; import java.io.Serializable; import javax.annotation.PreDestroy; import javax.enterprise.context.RequestScoped; import javax.inject.Named; @RequestScoped @Named(
昨日のコメントで書いたやつをエントリに格上げしてみる。 CDIを使うメリットはおそらくアプリケーションサーバーの各種機能が使いやすくなるというのが一番ですね。CDI自体の機能がどうのこうのではなく。 今まではアプリケーションサーバー管理のクラスはJSFの管理Bean、サーブレット、フィルタ、リスナーくらいでした。これらのクラスは簡単にEJBやらデータソースやらトランザクション管理やらメッセージングやらアプリケーションサーバーに実装されたものが扱えます。 ですが、それ以外だと簡単とは行きませんでした。 便利な機能がアプリケーションサーバーにせっかくたくさんあるのにそれを使うのが容易ではない、と。結果全部DIコンテナやらその上のフレームワークで実装することが多かったと思います。結局ただのサーブレットコンテナに成り下がっています。同じものがあるのにそれを使わない、いわば車輪の再発明だらけというの
CDI(旧名WebBeans)入門 その1 CDI(旧名WebBeans)入門 その2 CDI(旧名WebBeans)入門 その3 CDI(旧名WebBeans)入門 その4 CDI(旧名WebBeans)入門 その5 の続き。 今回はプロデューサーメソッドについて。 Google Guiceを知っている人ならプロバイダーメソッド(@Provides)と同じようなものと考えるとわかりやすい。 たとえばデータベースのコネクションを取得するコードを書いてみる。 package produce; import java.sql.Connection; import java.sql.SQLException; import javax.annotation.Resource; import javax.enterprise.context.RequestScoped; import javax.
注入の基礎 各種スコープの説明 インターフェースからの注入 AOP の続き。 今回はELでのアクセス。 といっても難しいことは何も無い。 ランダムな値を取得するサービス。 import java.util.Random; import javax.enterprise.context.ApplicationScoped; import javax.inject.Named; @Named("random") @ApplicationScoped public class RandomService { Random r = new Random(); public int getInt(){ return r.nextInt(); } } それを表示するJSP。 <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE
注入の基礎 各種スコープの説明 インターフェースからの注入 の続き。 今回はAOP。 といってもEJB3のAOPと同じ。EJB3のときもアノテーションをEJBパッケージにしないで汎用的なパッケージにしていたのでそのまま使う。 つまり、CDIとはPOJOへEJBの便利な機能を徐々に付与していくためのものと考えるといいかもしれない。 まずは基礎となるハローサービス サーブレット。 package hello; import java.io.IOException; import java.io.PrintWriter; import javax.inject.Inject; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Ht
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く