(三)Spring 高階裝配 bean的作用域@Scope
阿新 • • 發佈:2019-09-25
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