SpringプレミアムアセンブリのBeanの役割ドメイン

4892 ワード

SpringアプリケーションコンテキストのすべてのBeanは、デフォルトでは単一のインスタンス(singleton)モードを使用して作成されていることがわかります.ほとんどの場合、単一のBeanは理想的なスキームである.初期化とゴミ回収オブジェクトインスタンスによるコストはいずれも低い.しかし、使用するクラスは変わりやすい(mutable)ことに気づくかもしれません.彼らはいくつかの状態を維持するので、再利用は安全ではありません.この場合、classを単一の例として宣言するBeanは、オブジェクトが汚染され、汚染されたオブジェクトを再利用すると予想外の問題が発生するため、良いアイデアではありません.心配しないでください.強力なSpringはすでに解決策を提供しています.Springは様々な役割ドメインを定義し、これらの役割ドメインに基づいてbeanを作成することができます.以下のようにします.
役割ドメイン名
説明
単一例(Singleton)
アプリケーション全体でbeanのインスタンスが1つしか作成されません
プロトタイプ(Prototype)
注入またはコンテキストで取得するたびに、新しいbeanインスタンスが作成されます.
セッション(Session)
Webアプリケーションでは、セッションごとにbeanインスタンスを作成します.
リクエスト(Request)
Webアプリケーションでは、リクエストごとにbeanインスタンスを作成します.
単一の例はデフォルトの役割ドメインですが、前述したように、変更しやすいタイプでは適切ではありません.実際にSpringで提供されている@Scope注記は、@Componentまたは@Beanとともに使用できます.NotePadの役割ドメインをプロトタイプとして宣言します.
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class NotePad {

}

ここで使用するConfigurableBeanFactoryクラスのSCOPE_PROTOTYPE定数はプロトタイプの役割ドメインを設定します.表示方式で宣言されたBeanを使用している場合は、@Scopeも@Beanと連携して使用できます.
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public NotePad notePad(){
    return new NotePad();
}

同様にXMLを使用してbeanを構成する場合は、要素のscopeプロパティを使用して役割ドメインを設定できます.


1.セッションおよびリクエストの役割ドメインの使用
実際のエンタープライズ開発では、Beanの役割ドメインを定義するために@Scopeを使用します.ユーザーのカート情報のように、カート類を単例(Singleton)と宣言すると、各ユーザーが同じカートに商品を追加し、混乱を招くに違いない.プロトタイプモードを使用してカートを宣言することを考えるかもしれませんが、同じユーザーが異なるリクエストをした場合、取得したカート情報は異なり、これも混乱しています.この場合、カートの役割ドメインをセッション(Session)に設定するのは最適です.
@Service
@Scope(value=WebApplicationContext.SCOPE_SESSION,
    proxyMode=ScopedProxyMode.INTERFACES)
public class Cart {

}

ここで、valueの値をWebApplicationContextのSCOPE_に設定します.SESSION定数(彼の値はsession).これによりSpringにセッションごとにCartを作成するように伝えられます.注意深い友达はすでに発見したかもしれませんが、@Scopeの中にはもう一つの属性proxyModeがあり、彼はScopeProxyModeに設定されています.INTERFACES.このプロパティは、セッションまたはリクエストされたbeanを単一のbeanに注入する際に発生する問題を解決します.その前に、この問題が何なのか見てみましょう.Cart beanを単一のStoreService beanのsetterメソッドに注入すると、次のようになります.
@Service
public class StoreService {
    
    @Autowired
    private Cart cart;

}

SroreServiceは単一のbeanであるため、Springがコンテキストロードを適用するときに作成されます.彼が作成するとSpringはCartbeanをその属性に注入しようとします.しかしcart beanはセッション役割ドメインであり,この場合は存在しない.Cartインスタンスは、ユーザーがシステムに入るまで作成されません.さらに、各セッションに1つのCartインスタンスが複数存在します.私たちはSpringに固定されたCartを注入させたくない.Springが今回の会話のCart beanを注入することを望んでいる.実際、Springでは実際のCart beanはStoreServiceに注入されず、SpringではCart beanのエージェントが注入されます.このエージェントはCartと同じ方法を暴露するので、彼はショッピングカートだと思っています.StoreServiceがCartメソッドを呼び出すと、エージェントはそれを解析し、セッションの役割ドメイン内の本当のCart beanに依頼します.今、私はiたちがこの役割ドメインに対する理解を持って、proxyMode属性を討論して、proxyMode属性はScopeProxyModeに設定されました.INTERFACESは、このエージェントがCartインタフェースを実装し、実装beanに依頼することを示す.Cartがクラスではなくインタフェースであれば可能である(最も理想的なエージェントモードはインタフェースを実現することである).しかし、Cartが特定のクラスである場合、CGLibを使用してクラスベースのエージェントを生成する必要があります.この場合、proxyMode属性をScopeProxyModeに設定する必要があります.TAGER_CLASSは、ターゲットクラスの拡張を生成する方法でエージェントを作成するように見えます.リクエスト(Request)役割ドメインのアセンブリメカニズムも同様である.
2.XMLでの役割ドメインエージェントの宣言
xmlでプロキシモードを宣言し、使用するプロパティscope.Spring AOPネーミングスペースの新しい要素を使用するプロキシ・モードを設定します.



は、@scope注記のproxyModeプロパティ機能と同じSpring XML構成要素です.Springはbeanの役割ドメインエージェントを作成するように伝えます.デフォルトではCGLibモードのエージェントを作成します.エージェントを作成するモードを指定することもできます.



要素を使用するには、XMLでSpring AOPを宣言するネーミングスペースを構成する必要があります.


...


ここで、Spring beanの役割ドメインの構成について説明します.次のセクションでは、Springのより高度な構成であるランタイムインジェクションについて説明します.