シナリオ
私たちは、Beanのスコープを設定すると@Scope
、ショッピングカートのシナリオがあるとき、我々は通常のBeanを格納するSingleton
単一の場合、間違いなくカートは、各ユーザのショッピングカートbeanを設定するために、すべて一人ではありませんSession
。
@Component
@Scope(
value = WebApplicationContext.SCOPE_SEESION,
proxyMode = ScopedProxyMode.TARGET_CLASS
)
public class ShoppingCart {
}
@Component
public class StoreService {
private ShoppingCart shoppingCart;
@Autowired
public void setShoppingCart(ShoppingCart shoppingCart){
this.shoppingCart = shoppingCart;
}
}
問題
そのためStoreService
ロードされたSpringアプリケーションコンテキストの時に作成された豆のシングルトン、。それが作成されたときに、春がしようとしますShoppingCart
setShoppingCart(メソッド)に豆。
しかし、ShoppingCart
Beanはスコープのセッションで、この時点では存在しません。ユーザーがシステムに入った後、セッションを作成するまで、表示されるShoppingCart
インスタンスを。
さらに、システム内に複数持つShoppingCart
インスタンスを:ユーザーごとに1つ。私たちは、春が固定注入させたくないShoppingCart
のインスタンスをStoreService
真ん中。自分のショッピングカートを保持する必要があり、各ユーザので。
解きます
することにより@Scope
設定proxyMode
パラメータ。春は実際のではないだろうShoppingCart
に豆StoreService
。
春はに注入されますShoppingCart
、そのエージェント豆。このエージェントが暴露されるShoppingCart
同じ方法で、あなたはStoreService
それがショッピングカートだと思います。しかし、StoreService
呼び出しShoppingCart
方法は、エージェントが怠惰な解析に委託しての本当の役割の中にセッションを呼び出すことになるShoppingCart
豆。
注意を払います
ScopedProxyMode.INTERFACES
これは、インターフェイスのために使用されています。
必要とされている特定のクラスScopedProxyMode.TARGET_CLASS
。