springの中でbeanの作用の領域
どのようにspringの作用領域を使いますか?
spring 2.0の前にbeanは2つの作用領域だけがあります.すなわち、singleton(単例)、non-singleton(prototypeともいいます.)、Spring 2.0以降は、session、request、global sessionの3つのWebアプリケーションコンテキストに専用のBeanが追加されました.ですから、デフォルトではSpring 2.0は現在5種類のBeanがあります.もちろん、Spring 2.0はBenのタイプのデザインを再現し、柔軟なBeanタイプのサポートを設計しています.理論的には無数の種類のBeanがあり、ユーザーは自分のニーズに応じて、新しいBeanタイプを追加して、実用的な需要を満たすことができます.
1、singletonスコープ
1つのbeanの役割領域がsingletonとして設定されると、Spring IOC容器には共有されたbeanの一例だけが存在し、全てのbeanに対する要求は、idがbeanの定義に一致する限り、beanの同じ例に戻るだけである.言い換えれば、1つのbeanをsingleton作用領域として定義すると、Spring IOC容器はこのbean定義の唯一の例を作成するだけである.この単一の例は単一の例キャッシュに格納され、そのBEanに対する後続の要求と参照はすべてキャッシュされた対象のインスタンスに戻ります.ここで注意すべきことは、singletonスコープとGOF設計モードの単一の例は全く違っています.単一の例の設計モードは、一つのクラスLoaderの中に一つのクラスしか存在しないことを示しています.ここのsingletonは一つの容器が一つのbeanに対応することを表しています.つまり、一つのbeanがsingletonとしてマークされたとき、springのIOC容器の中には一つのbeanしか存在しません.
設定例:
prototypeのスコープ展開のbeanは、各要求(他のbeanに注入するか、またはプログラムで容器を呼び出すget Bean(メソッド)は、新しいbeanのインスタンスを生成します.相当なnewの操作は、prototypeのスコープのbeanにとって非常に重要です.容器は初期化、配置、装飾またはプロトタイプの一例を組み立てた後、クライアントに渡して、プロトタイプの例を無視します.どのような作用領域でも、コンテナはすべてのオブジェクトの初期化ライフサイクルのコール方法を使用しますが、プロトタイプにとっては、任意の配置されたデストラクターライフサイクルのコールバック方法は起動されません.prototypeスコープの対象をクリアして、任意のプロトタイプbeanが保有する高価なリソースを解放するのは、クライアントコードの役割です.(Spring容器をsingleton作用領域beanによって資源を占有させるための実行可能な方法は、beanのバックプロセッサを使用することによって、このプロセッサはクリアされるべきbeanの参照を持っている.)
設定例:
requestは、このHTTP要求に対して新たなbeanが生成されることを示しており、このbeanは現在のHTTP request内でのみ有効である.request、session、global sessionを使う時はまずweb.xmlに次のように配置します.
Servlet 2.4以上のwebコンテナを使用すると、webアプリケーションのXML声明ファイルweb.xmlに下記のContect Listenerを追加するだけで良いです.
session機能領域は、このHTTP要求に対して新たなbeanが生成されることを示しており、現在のHTTP session内でのみ有効であり、構成例:構成例:request構成例の前提と同様に、ウェブ起動ファイルを構成すれば、次のような構成が可能である.
global sessionのスコープは標準的なHTTP Sessionのスコープに似ていますが、それはポータブルベースのウェブアプリケーションだけで意味があります.Portlet仕様は、グローバルSessionの概念を定義し、あるポータブルウェブアプリケーションを構成する様々な異なるポートレートによって共有されている.global sessionの役割領域で定義されたbeanは、グローバルportlet Sessionのライフサイクル範囲に限定される.webでglobal session機能領域を使用してbeanを識別すると、webは自動的にsessionタイプとして使用されます.構成例:request構成例の前提と同様に、ウェブ起動ファイルを構成すれば、以下のように構成できる.
springletonとprototypeはspringでは任意に拡張できます.作用領域をカスタマイズして、既存の作用領域を再定義することもできます.springの作用領域はインターフェースorg.springframe ork.beans.factory.co fig.Scopeによって定義されます.自分の作用領域はこのインターフェースを実現すればいいです.以下の例をあげます.スレッドを表すscopeを作成します.このscopeはスレッド内で有効で、コードは以下の通りです.
<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
ここのscopeはspring beanの役割領域を構成するために使われています. spring 2.0の前にbeanは2つの作用領域だけがあります.すなわち、singleton(単例)、non-singleton(prototypeともいいます.)、Spring 2.0以降は、session、request、global sessionの3つのWebアプリケーションコンテキストに専用のBeanが追加されました.ですから、デフォルトではSpring 2.0は現在5種類のBeanがあります.もちろん、Spring 2.0はBenのタイプのデザインを再現し、柔軟なBeanタイプのサポートを設計しています.理論的には無数の種類のBeanがあり、ユーザーは自分のニーズに応じて、新しいBeanタイプを追加して、実用的な需要を満たすことができます.
1、singletonスコープ
1つのbeanの役割領域がsingletonとして設定されると、Spring IOC容器には共有されたbeanの一例だけが存在し、全てのbeanに対する要求は、idがbeanの定義に一致する限り、beanの同じ例に戻るだけである.言い換えれば、1つのbeanをsingleton作用領域として定義すると、Spring IOC容器はこのbean定義の唯一の例を作成するだけである.この単一の例は単一の例キャッシュに格納され、そのBEanに対する後続の要求と参照はすべてキャッシュされた対象のインスタンスに戻ります.ここで注意すべきことは、singletonスコープとGOF設計モードの単一の例は全く違っています.単一の例の設計モードは、一つのクラスLoaderの中に一つのクラスしか存在しないことを示しています.ここのsingletonは一つの容器が一つのbeanに対応することを表しています.つまり、一つのbeanがsingletonとしてマークされたとき、springのIOC容器の中には一つのbeanしか存在しません.
設定例:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/> <bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>
2、prototype prototypeのスコープ展開のbeanは、各要求(他のbeanに注入するか、またはプログラムで容器を呼び出すget Bean(メソッド)は、新しいbeanのインスタンスを生成します.相当なnewの操作は、prototypeのスコープのbeanにとって非常に重要です.容器は初期化、配置、装飾またはプロトタイプの一例を組み立てた後、クライアントに渡して、プロトタイプの例を無視します.どのような作用領域でも、コンテナはすべてのオブジェクトの初期化ライフサイクルのコール方法を使用しますが、プロトタイプにとっては、任意の配置されたデストラクターライフサイクルのコールバック方法は起動されません.prototypeスコープの対象をクリアして、任意のプロトタイプbeanが保有する高価なリソースを解放するのは、クライアントコードの役割です.(Spring容器をsingleton作用領域beanによって資源を占有させるための実行可能な方法は、beanのバックプロセッサを使用することによって、このプロセッサはクリアされるべきbeanの参照を持っている.)
設定例:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/> <beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/>
3、レクサス requestは、このHTTP要求に対して新たなbeanが生成されることを示しており、このbeanは現在のHTTP request内でのみ有効である.request、session、global sessionを使う時はまずweb.xmlに次のように配置します.
Servlet 2.4以上のwebコンテナを使用すると、webアプリケーションのXML声明ファイルweb.xmlに下記のContect Listenerを追加するだけで良いです.
<web-app>
...
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
...
</web-app>
Servlet 2.4以前のwebコンテナであれば、javax.servlet.Filterの実装を使用します.:<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>
次に、beanの役割領域を設定することができる.<bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>
4、セッション session機能領域は、このHTTP要求に対して新たなbeanが生成されることを示しており、現在のHTTP session内でのみ有効であり、構成例:構成例:request構成例の前提と同様に、ウェブ起動ファイルを構成すれば、次のような構成が可能である.
<bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/>
5、global session global sessionのスコープは標準的なHTTP Sessionのスコープに似ていますが、それはポータブルベースのウェブアプリケーションだけで意味があります.Portlet仕様は、グローバルSessionの概念を定義し、あるポータブルウェブアプリケーションを構成する様々な異なるポートレートによって共有されている.global sessionの役割領域で定義されたbeanは、グローバルportlet Sessionのライフサイクル範囲に限定される.webでglobal session機能領域を使用してbeanを識別すると、webは自動的にsessionタイプとして使用されます.構成例:request構成例の前提と同様に、ウェブ起動ファイルを構成すれば、以下のように構成できる.
<bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/>
6、カスタムbean組立作用エリア springletonとprototypeはspringでは任意に拡張できます.作用領域をカスタマイズして、既存の作用領域を再定義することもできます.springの作用領域はインターフェースorg.springframe ork.beans.factory.co fig.Scopeによって定義されます.自分の作用領域はこのインターフェースを実現すればいいです.以下の例をあげます.スレッドを表すscopeを作成します.このscopeはスレッド内で有効で、コードは以下の通りです.
publicclass MyScope implements Scope ...{
privatefinal ThreadLocal threadScope = new ThreadLocal() ...{
protected Object initialValue() ...{
returnnew HashMap();
}
};
public Object get(String name, ObjectFactory objectFactory) ...{
Map scope = (Map) threadScope.get();
Object object = scope.get(name);
if(object==null) ...{
object = objectFactory.getObject();
scope.put(name, object);
}
return object;
}
public Object remove(String name) ...{
Map scope = (Map) threadScope.get();
return scope.remove(name);
}
publicvoid registerDestructionCallback(String name, Runnable callback) ...{
}
public String getConversationId() ...{
// TODO Auto-generated method stub
returnnull;
}
}
回転:http://hi.baidu.com/fyj868/blog/item/be3fececc164a73827979131.html