EJB3.0のDependency Injection

うすうす気付いてはいたが、EJB3.0Dependency Injectionは汎用性が低いようだ。

JBossEJB3.0 TrailBlazerより、

Please note that EJB 3.0 dependency injection annotations only works in EJB objects -- not generic POJOs. For instance, you cannot use the dependency injection annotations in a servlet to obtain session bean objects. In addition, EJB 3.0 dependency injection only works in the local JNDI. Hence you cannot inject objects from remote servers.

EJB3.0Dependency InjectionアノテーションEJBオブジェクトにのみ有効である - 一般的なPOJOは対象外である。例えば、ServletでSessionBeanを取得するのにDependency Injection Annotationは使用できない。更に、EJB3.0Dependency Injectionはlocal JNDIに対してのみ働く。ゆえにリモートサーバのオブジェクトはインジェクトできない。


うーーーむ。
上記は全部SpringやSeasarなどの既存のDIコンテナではできるぞ。
しかもDIできるオブジェクトが限定されているって、EJBで実装されていないコンポーネントを持って来るとか考えられていなし、RMIなど他にも色々DIしたいものはあるぞ。
JBoss Seamを使うと@Inアノテーションで、任意のオブジェクトをインジェクトできそう(未確認)ではあるが・・・。
EJB3.0時代になってもDIコンテナはまだまだ必要だろう。というかDI使いたいなら、素直にDIコンテナを使うべきか。


ここで死亡宣言をされてしまったEJBだが、EntityBeanはPersitence APIで息を吹き返しそうなものの、SessionBeanはLocalインターフェースやDIを取り入れたりで、どうもふらふらしている。分散オブジェクトとしては、SOA時代が到来しリアルタイムのトランザクショナルなシステム間連携が求められた時に蘇るような気がするが。

EJB 3.0 Feature Overview

最近EJB3.0が気になっていたが、JBossのサイトに分かりやすくまとめてあったので翻訳。


EJB 3.0 Feature Overview


EJB3.0の目的は2つある。1)エンタープライズJavaアプリケーションの開発を簡単にすること。2)Java Persistance APIを標準化すること※1。JBossEJB3.0をEnterprise Javaの簡素化の分岐点と見ている。JBossチーフアーキテクトBill BrukeとHibernate設立者のGavin Kingは、JBossを代表してEJB3.0(JSR-220)仕様策定チームに参加した。EJB3.0は、Java Enterprise Editionはもちろん、JBossHibernateの未来にも深い影響を及ぼしている。EJB3.0仕様策定チームはいくつかのドラフトをリリースし、JBossJBoss Application Server上でEJB3.0をテストすることでEJB3.0の動きを捕捉してきた。


EJB3.0には以下に示す主要な特徴がある。


EJB APIの簡素化


EJB3.0は、HomeインターフェースとEJBAPI※2を実装する必要性を排除している。Sesson Bean、Message Driven Bean、Entity Beanは単なるJava Beanとなり、ビジネスロジックの実装に専念できる。Entity Beanは煩わしいインターフェースが不要な標準的なJavaクラスになったが、これはEntity Beanがオブジェクト指向デザイン - 継承、ポリモーフィズム、他のオブジェクト指向の規約 - を適用することができるようになった事を意味する。


アノテーション


EJB3.0はJDK5.0で導入されたアノテーションを取り入れている。アノテーションの導入により、デプロイメントディスクリプタの使用が完全にオプションになる。EJB3.0仕様はBean Type、Dependency Injection、トランザクション、セキュリティ、コールバック、O/Rマッピング、リレーションなど広い範囲のアノテーションを規定している。デプロイメントディスクリプタは、アノテーションを上書きすることを目的として残されている。JBoss Application ServerとHibernateは共にこれらのアノテーションをサポートするが、これにより、Hibernateを使うことによって、EJB3.0アノテーションEJB3.0コンテナの外部のスタンドアロンJavaアプリケーションで活用できる。


Dependency Injection


EJBや関連するリソースををルックアップするのにお決まりのコードは不要になった。@Injectや@EJB、@Resourceアノテーションの導入によって、これらの依存性は、コンテナによって透過的にJava Beanに注入される。


コールバック


開発者が必要に応じてコールバックを実装できるようになった。@PostConstruct、@PreDestroy、@PrePersis、@PostPersitなどのコールバックアノテーションによって、開発者はどんなJava Beanやコールバッククラスメソッドでも、イベント受信時にコールバックさせることができる。


Entity Manager API


Entity Manager APIEJB3.0に導入され、Java Beanインスタンスを永続化対象から切り離し、ローカルでアップデートし、Entity Managerに送信して、databaseに永続化することを可能にすること目的に設計されている。JBoss Application ServerとHibernate共にこの新しいAPIをサポートしている。


永続化の簡易化とクエリの改良


EJB3.0は、このAPIの策定に不可欠な役割を果たしているHibernateによって、Javaの永続化モデルを標準化している。O/Rマッピングと広範囲の関係モデルを扱うためにアノテーションが定義された。EJB3.0EJB-QLを改良し、ダイナミッククエリやサブクエリ、バルクアップデート、バルクデリートをサポートする。


コンテナ外部での使用


EJB3.0使用は、新しいPersistence APIJavaアプリケーションで使用することを可能にしている。JBoss EJB3.0では、Session BeanとMessage Driven Beanを、アプリケーションサーバ外部のスタンドアロンJavaアプリケーション、JUnit Test、Tomcat、更には他のアプリケーションサーバでも使用する事を可能にしている。詳しい情報をはここから。



※1 HibernateTopLink、JDO等Persistence APIが複数存在していることが問題になっていた
※2 ejbCreate()など


EoD、DI、PersistenceAPIが目玉のようだ。
以下、更に知りたいところである。

  • Hibernateを直接使う場合と何が違うのか?
  • EJB3.0のDIでSpringは不要になる?


この辺りは実際使いながら調べていこう。

StatisticsCollector

lf13102005-11-24


SQLの実行時間集計機能の追加完了。最小、平均、最大を集計している。
これだけあれば、とりあえず「遅い!」ってなった時に、どこが遅いのか切り分けられるだろう。あとは、OracleのStatsPackなどを使ってDB側の統計情報と合致しているかテストして完了予定。

今回のHackでStatisticsCollector仕組みが理解できた。
java.sql.Connection、Statement、PreparedStatementをインプリメントしたダミークラスを経由して、各メソッドで統計情報を取得してから、本物にディスパッチしている。なるほど・・・。


以下見送り事項

  • EJB3対応にするにはInterceptorの親クラスを org.jboss.ejb.plugins.AbstractInterceptorからorg.jboss.aop.advice.Interceptorに変更する必要あり。下位互換を考慮すると両バージョン必要になるが、#JBAS-1436JCAに統計情報の追加がされるようだ。StatisticsCollectorはとりあえずJ2EE1.4用としておいていいだろう。
  • メソッドの実行時間測定は、Interceptorアーキテクチャ上、自分自身を通過したらおしまいなので難しい。つまりInterceptorをかます方法では、Interceptor Stack全体の実行時間は測れない。


本家Wikiのtodoに加えて見た目が悪い(^^;等、まだ気になる所はあるが、また別の機会に。

[jboss] JBoss呑み

参加しました。
単独潜入でしたが、いい人ばかりで楽しい時間を過ごせました。
Benさんも物腰が柔らかい紳士的な方でした。このページの写真とはかなりイメージが違いました。
(最近英語を使っていないので思ったように話せなかったのが少し残念)
上司が、魅力的なコミュニティには魅力的な人が集まるなんて言っていましたが、まさにそうだと思いました。


そしてJapan JBoss User Group設立のアナウンス。
盛り上がっていきそうです。

StatisticsCollector

EJB3のInterceptor Stackはdeploy/ejb3-interceptors-aop.xmlで定義されていた。
standardjboss.xmlと異なり、JBoss-AOPベースになっている。
次世代のJBossEJBコンテナはAOPベースで構成されていることが分かって面白い。


ただ、StatisticsCollectorがJBoss-AOPでそのまま使えるものなのか、JBoss-AOPの使い方自体を整理しなければならないといった課題があるので、EJB3でStatisticsCollectorを使う方法はしばし保留。
EJB2ベースで実行時間を収集する機能が追加できるか、見ていく。