連載
» 2007年11月01日 00時00分 公開

Spring 2.0時代の開発スタイル(3):Spring 2.0で自分なりの開発スタイルを確立しよう (3/3)

[山本大,株式会社クロノス]
前のページへ 1|2|3       

新しく追加されたスコープとは?

 新しく追加されたスコープはWebアプリケーションのみで利用できる「request」「session」「global session」というスコープです。「global session」スコープは、PortletベースのWebアプリケーションでのみ利用するスコープであるため割愛し、この章では一般的に利用する「request」スコープと「session」スコープを紹介します。

編集部注:Webアプリケーションのスコープについて詳しく知りたい読者は、連載「やり直し『JSPとTomcat』」第9回「JSPのスコープをちゃんと使いこなせてますか?」を参照してください。

Webアプリケーション用のスコープを使用するための準備

 新しく追加されたWebに関するスコープを利用するためには、SpringのApplicationContextの実装としてWebアプリケーション用の実装を利用する必要があります(通常のContext実装を使ってこれらのスコープを参照しようとすると、IllegalStateExceptionが発生します)。

 例えば、以下(リスト11)のサンプルのようにWebApplicationContextを利用できます。

リスト11 Webスコープを利用するためのContext(WebApplicationContext)
WebApplicationContext contxt
    = WebApplicationContextUtils.getWebApplicationContext(
          this.getServletContext());

 また、上記のWebApplicationContextを利用するためには、web.xmlに対しての設定、およびlog4jのライブラリにクラスパスを設定することが必要です。このうちweb.xmlに対する設定には、利用するServletのバージョンに応じて2通りの方法があります。

編集部注:web.xmlの設定について詳しく知りたい読者は、連載「やり直し『JSPとTomcat』」第12回「Webアプリケーションのパッケージングを『やり直す』」の「web.xmlの書き方を確認しよう!」を参照してください。

 バージョン2.4以降のServletコンテナを利用しているなら、以下(リスト12)の設定をweb.xmlファイルに記載してください(Servlet 2.4では、こちらの設定が推奨されています)。この設定により、リクエストを処理するスレッドにHTTPリクエストのオブジェクトをバインドします。それによって、requestおよびsessionスコープのBeanが有効になります。

リスト12 Webスコープを利用するためのweb.xml初期設定(Servlet 2.4以降の環境)
<!-- WebApplicationContextを利用するための設定 -->
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>

<!-- Webスコープを利用するための設定 -->
<listener>
  <listener-class>
    org.springframework.web.context.request.RequestContextListener
  </listener-class>
</listener>

 Servlet 2.4以前の環境を利用している場合、contextLoaderServletおよびrequestContextFilterの実装を利用します。以下のXML設定ファイルのサンプルをweb.xmlに記述してください。Servlet 2.4では、以下の設定は非推奨となっていますが、上記の設定と効果は同じです。

リスト13 Webスコープを利用するためのweb.xml初期設定(Servlet 2.4以前の環境)
<!-- WebApplicationContextを利用するための設定 -->
<servlet>
  <servlet-name>contextLoaderServlet</servlet-name>
  <servlet-class>org.springframework.web.context.ContextLoaderServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>contextLoaderServlet</servlet-name>
  <url-pattern>/contextLoader</url-pattern>
</servlet-mapping>

<!-- Webスコープを利用するための設定 -->
<filter>
  <filter-name>requestContextFilter</filter-name>
  <filter-class>org.springframework.web.filter.RequestContextFilter
  </filter-class>
</filter>
<filter-mapping>
  <filter-name>requestContextFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

HTTPリクエストごとに1つのBeanのインスタンスを保持できるrequestスコープ

 requestスコープのBeanを定義するには、Bean定義において以下(リスト14)の設定を記述します。

リスト14 requestスコープのオブジェクトとして利用するためのBean定義
<bean id="loginReqData" class="net.kronos_jp.LoginData"
    scope="request"/>

 上記のBean定義は、LoginDataというBeanのインスタンスを「loginReqData」という名前で、毎回のリクエストに対してバインドし利用できるようにします。この際、Springのコンテナはリクエストごとにインスタンスを生成して「loginReqData」という名前でバインドします。

 「loginReqData」のインスタンスはHTTPリクエストの期間は有効であり、これらのオブジェクトの状態を自由に書き換えることができます。当然、ほかのHTTPリクエストには影響を与えません。

 リクエストの処理が終了すると、バインドされたBeanは削除されます。

HTTPセッションごとに限定したスコープを持つBeanを定義するsessionスコープ

 sessionスコープのBeanを定義するには、Bean定義において以下(リスト15)の設定を記述します。

リスト15 sessionスコープのオブジェクトとして利用するためのBean定義
<bean id="loginSesData" class="net.kronos_jp.LoginData"
    scope="session"/>

 上記の設定では、LoginDataを「loginSesData」という名前で、1回のHTTPセッションを生存期間とするようにSpringのコンテナに定義しています。

 requestスコープのときのように「loginSesData」はHTTPセッションの期間で有効であり、ほかのセッションに影響しないオブジェクトを定義できます。

Spring 2.0で自分なりの開発スタイルを確立しよう

 Spring 2.0では、効率化・簡素化の観点でさまざまな変更が加えられており、また要望の高い新機能も対応しています。前バージョンでの問題点に対して着実に修正や補強が加えられていくことも普及するフレームワークの条件ということができます。

 本稿で今回の連載は終了です。記事の中で見てきたようにSpring 2.0とSpring IDE 2.0を組み合わせることで開発効率を向上できます。今後Springを使った開発では、Spring 2.0とSpring IDE 2.0を組み合わせる開発スタイルが主流となることは間違いないでしょう。

 本連載では、Spring 2.0およびSpring IDE 2.0の機能の一部しか紹介できませんでしたので、ドキュメントなどを参考にしてさらに自分なりの開発スタイルを確立していくことをお勧めします。

@IT関連記事

DIとAOPがサーバ・コンポーネント技術を変える
J2EE Watch(7) EJBのような重量級のコンテナに対するアンチテーゼとして登場したDI。いまやDI+AOPは、J2EEの未来にも影響を与える存在となりつつある
Java Solution」フォーラム 2005/6/17

Spring Frameworkで理解するDI
最近よく耳にする「DI」は、オブジェクトの再利用性を高めるとして注目される新しい考え方だ。このDIをSpringを使いながら理解する
第1回 DI:依存性の注入とは何か?(2005/4/29)
第2回 Springフレームワークの設計思想とAOP(2005/11/23)
第3回 AOPサンプルアプリで理解するAOP(2005/12/3)
第4回 なぜDIコンテナを使うのか(2006/8/10)
連載各回の解説はこちら

Java EE 5マイグレーションプラクティス
「Java EE 5」の登場は近い。マイグレーションの近道は、実はJSF、Spring、Hibernateを使い、理解するところにある
第1回 JSF・Spring・Hibernateで次世代Javaに備える(2005/7/6)
第2回 鍵はPOJOベースのアプリケーション・デザイン(2005/7/23)
第3回 JSFベースのプレゼンテーション・デザインを考える(2005/8/27)
第4回 擬似EJB3.0環境をSpringとXDocletで作る(2005/10/20)
第5回 Sインテグレーション層のDAOデザインを考える(2006/1/6)
連載各回の解説はこちら

Seasar Projectの全貌を探る
国産オープンソースプロダクトのコミュニティとして急成長するSeasar2。大手SIerもサポートを表明したJ2EEプロダクトの全貌を探る
第1回 次世代J2EEを目指すSeasar2はどう誕生したか(2005/6/9)
第2回 DI+AOPを実現するSeasar V2(2005/7/16)
第3回 SeasarV2によるDBアクセス機能(2005/9/3)
第4回 SeasarV2によるテスト機能(2005/10/1)
第5回 SeasarのO/RマッピングツールS2Dao(2005/12/23)
第6回 SeasarのDBアクセスにHibernateを使う(2006/1/19)
連載各回の解説はこちら

アスペクト指向プログラミング オーバービュー
The Rational Edge(24) IT業界はソフトウェア構築アプローチの改良の歴史でもある。このラインアップに最近加わったのが、アスペクト指向プログラミングだ
情報マネジメント > アーキテクチャ 2004/4/13

アスペクト指向のバリエーション解説
この連載では「アスペクト指向とは何か?」というところから始め、AspectJやJBossAOPなどを用いたAOPの実装を紹介していく
第1回 アスペクト指向の基礎とさまざまな実装
第2回 AspectJから学ぶアスペクト指向の理解
第3回 JBoss AOPとAOPフレームワークの役目
第4回 「AspectWerkz」の利用法
第5回 アスペクト指向理解のまとめ
情報マネジメント > アーキテクチャ

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。