Spring学習ノート(2)---Beanの役割ドメイン


1.Singletonスコープ
1つのbeanの役割ドメインがsingletonである場合、Spring IoCコンテナには共有beanインスタンスが1つしか存在せず、idがbean定義に一致する限り、beanに対する要求はすべて返されます.
すなわち、1つのbean定義がsinglton役割ドメインに設定されている場合、Spring IoCコンテナは、そのbean定義の一意のインスタンスのみを作成します.この単一インスタンスは、単一インスタンスキャッシュ(singleton cache)に格納され、beanに対する後続の要求および参照は、キャッシュされたオブジェクトインスタンスを返します.
Singleton役割ドメインはSpringのデフォルト役割ドメインです.XMLでbeanをsingletonとして定義するには、次のように構成します.
<bean id="accountService" class="com.foo.DefaultAccountService"/>

<bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/>

<bean id="accountService" class="com.foo.DefaultAccountService" singleton="true"/>

2.Prototypeスコープ
Prototype役割ドメインのbeanは、beanリクエスト(別のbeanに注入するか、コンテナのgetBean()メソッドをプログラム的に呼び出す)のたびに新しいbeanインスタンスを作成します.経験によれば、ステータスのあるbeanにはprototypeドメインを使用し、ステータスのないbeanにはsingletonドメインを使用する必要があります.
次の図はSpringのprototypeドメインを示しています.通常、DAOはセッションステータスを持たないため、singleton役割ドメインを使用する必要があります.
XMLでbeanをprototypeとして定義するには、次のように構成します.
<bean id="accountService" class="com.foo.DefaultAccountService" scope="prototype"/>

<bean id="accountService" class="com.foo.DefaultAccountService" singleton="false"/>

Web構成の初期化
request、session、global sessionの役割ドメインのbean(すなわち、web役割ドメインを持つbean)を使用するには、bean定義の設定を開始する前に、少量の初期構成を行います.「通常」の役割ドメイン(singletonとprototype)だけを望む場合は、この追加の設定は必要ありません.
現在の状況では、特定のservlet環境に応じて、この初期設定を完了する方法はいくつかあります.
Spring Web MVC、すなわちSpringDispatcherServiceletまたはDispatcherPortletを使用してリクエストを処理する場合は、DispatcherServiceletおよびDispatcherPortletが関連するすべてのステータスを処理している特別な構成は必要ありません.
Spring's DispatcherService以外のService 2.4以上のWebコンテナを使用する場合(JSFやStrutsなど)、Webアプリケーションの'webが必要です.xml'ファイルにjavaxを追加します.servlet.サーブレットRequestListener定義
<web-app>
  ...
  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
  ...
</web-app>

以前のバージョンのWebコンテナ(サーブレット2.4以前のバージョン)を使用している場合はjavaxを使用します.servlet.Filterの実装.次のwebを見てください.xml構成フラグメント:

<web-app>
  ..
  <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>
  ...
</web-app>

RequestContextListenerとRequestContextFilterの2つのクラスは同じ仕事をしています.HTTP requestオブジェクトをリクエストにサービスを提供するThreadにバインドします.これにより、requestおよびsession役割ドメインを有するbeanは、後続の呼び出しチェーンにアクセスすることができる.