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として定義するには、次のように構成します.
2.Prototypeスコープ
Prototype役割ドメインのbeanは、beanリクエスト(別のbeanに注入するか、コンテナのgetBean()メソッドをプログラム的に呼び出す)のたびに新しいbeanインスタンスを作成します.経験によれば、ステータスのあるbeanにはprototypeドメインを使用し、ステータスのないbeanにはsingletonドメインを使用する必要があります.
次の図はSpringのprototypeドメインを示しています.通常、DAOはセッションステータスを持たないため、singleton役割ドメインを使用する必要があります.
XMLでbeanをprototypeとして定義するには、次のように構成します.
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コンテナ(サーブレット2.4以前のバージョン)を使用している場合はjavaxを使用します.servlet.Filterの実装.次のwebを見てください.xml構成フラグメント:
RequestContextListenerとRequestContextFilterの2つのクラスは同じ仕事をしています.HTTP requestオブジェクトをリクエストにサービスを提供するThreadにバインドします.これにより、requestおよびsession役割ドメインを有するbeanは、後続の呼び出しチェーンにアクセスすることができる.
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は、後続の呼び出しチェーンにアクセスすることができる.