アットウィキロゴ
link_pdfプラグインはご利用いただけなくなりました。


DIできるもの

JavaEE5では、EJBコンテナ及びWebコンテナが管理するオブジェクトをDIする仕組みを持っている。

注入対象オブジェクト(注入するオブジェクト)
  • セッションBean
  • データソース
  • JMSのコネクションファクトリ
  • JMSのディスティネーション
  • JavaMailのセッション
  • JTAのユーザトランザクション
  • EJBコンテキスト
  • JPAエンティティマネージャ
  • JPAエンティティマネージャファクトリ
  • タイマーサービス
注入先オブジェクト(注入される・してもらうオブジェクト)
Webコンポーネント
  • サーブレット
  • フィルタ
  • リスナ
  • タグハンドラ
  • マネージドBean
EJBコンポーネント
  • セッションBean
  • インターセプタ
  • メッセージ駆動Bean
Webサービスコンポーネント
  • サービス実装クラス


マルチスレッド

マルチスレッド環境のインスタンス変数は以下のような対策でスレッドセーフにておく必要がある。
  • インスタンス変数を、状態を持たないオブジェクトにする
  • インスタンス変数を、イミュータブルオブジェクトにする
  • インスタンス変数内の状態に対する更新処理を、synchronizedブロックで同期化する
※イミュータブルオブジェクトとは、一度インスタンスを生成すると以降状態を変更できないオブジェクトをいう。

注入先オブジェクトの複数スレッド同時アクセス
注入先オブジェクト 生成単位 複数スレッドからの同時アクセス
サーブレット web.xmlのservlet要素ごと あり
フィルタ web.xmlのfilter要素ごと あり
リスナ web.xmlのlistener要素ごと あり
タグハンドラ リクエストごと なし
マネージドBean(アプリケーションスコープ) Webアプリケーションごと あり
マネージドBean(セッションスコープ) セッションごと あり
マネージドBean(リクエストスコープ) リクエストごと なし
セッションBean コンテナに複数のオブジェクトをプール なし
インターセプタ コンテナに複数のオブジェクトをプール なし
メッセージ駆動Bean コンテナに複数のオブジェクトをプール なし
サービス実装クラス(WAR) ひとつ あり
サービス実装クラス(EJB-JAR) コンテナに複数のオブジェクトをプール なし

注入対象オブジェクトのスレッドセーフ
注入対象オブジェクト スレッドセーフか?
セッションBean 実装依存
データソース 実装依存
JMSのコネクションファクトリ スレッドセーフ
JMSのディスティネーション スレッドセーフ
JavaMailのセッション 実装依存
JTAのユーザトランザクション スレッドセーフ
EJBコンテキスト スレッドセーフ
JPAエンティティマネージャ スレッドセーフでない
JPAエンティティマネージャファクトリ スレッドセーフ
タイマーサービス スレッドセーフ

注入先オブジェクトが複数スレッド同時アクセスありで、そこへ注入する注入対象オブジェクトがスレッドセーフでない場合は採用してはいけない。
たとえば、サーブレットへJPAのエンティティマネージャを注入してはいけない。
この場合、スレッドセーフなエンティティマネージャファクトリを注入し、そこからエンティティマネージャを取得して解決する。


参考

UFJIS株式会社 斉藤賢哉、マスタリングJavaEE5、翔泳社、2007年
最終更新:2008年11月15日 09:22