1. 程式人生 > >(三)Spring 高階裝配 bean的作用域@Scope

(三)Spring 高階裝配 bean的作用域@Scope

1.預設情況下,spring通過@Autowared注入的bean是單例的bean,但有些情況是不滿足的,例如:購物車,每個會話,或每個使用者登入使用的購物車都是獨立的

spring的定義的作用域:

a:單例(Singleton)

b:原型(prototype):每次注入的都會建立一個新的bean例項。

c:會話(session):web應用中,每個會話建立一個bean。

d:請求(Rquest):web應用中,為每個請求建立一個bean。

例子1:

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class Notepad{..........}
//使用ConfigurableBeanFactory.SCOPE_PROTOTYPE的原因是,比較“prototype”更為安全。

 

例子2:使用會話和請求作用域。

在一個單例 的service裡面注入一個會話作用域 的bean,spring注入service單例的時候,並不會建立會話作用域的bean。

而是當請求到來的時候建立。當會話到來時,spring注入的並不是實際的購物車bean,而是購物車bean的代理。那麼建立的時機:

如圖所示:

 

 

 

程式碼:

@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
    proxyMode=ScopedProxyMode.INTERFACES)
public ShoppingCart cart(){.........}

proxyMode的作用是表明這個代理要實現ShoppingCart介面,並將呼叫委託給實現的bean。

如果ShoppingCart是介面,那麼則使用以上的方式注入。如果ShoppingCart是實現類,spring則使用CGLIB的方式建立代理。

proxyMode的取值則是:ScopedProxyMode.TARGET_CLASS,表明要以生成目標類的方式建立代理。

&n