<
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