Spring速查手冊(二)——Bean的作用域
阿新 • • 發佈:2022-05-03
Bean的四種作用域
- 單例(Singleton):整個應用中,只建立一個bean。
- 原型(Prototype):每次注入或請求要給bean的時候都建立一個新的bean。
- 會話(Session):每個session建立要給bean。
- 請求(Request):每個WEB請求建立一個bean。
PS:Spring預設的bean是單例的!
使用會話/請求作用域的注意點
// 建立一個session的bean @Component @Scope(value=WebApplicationContext.SCOPE_SESSION) public A a{ …… } // 在單例bean中注入不同作用域的bean @Component public B b{ @Autowired public void setA ( A a ) { …… } }
上述程式碼會發生錯誤! 單例的bean在應用程式啟動的時候就初始化,並在初始化時需要注入session作用域的B,但session作用域的bean只有當有使用者的時候才建立,初始化的時候並沒有該物件。 再者,不同的使用者擁有不同的session,因此A物件將有成千上萬,而B物件有且僅有一個。 此時需要在session作用域的bean物件上加上註解:
// 建立一個session的bean @Component @Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopeProxyMode.INTERFACES) public A a{ …… }
該註解聲明後,注入給單例的將是該bean的代理,代理維護著不同session下的bean,當單例物件呼叫的將是代理物件,代理物件根據當前的session將請求轉發給制定的目標物件處理。
注意:若session作用域的物件無介面,則使用Cglib建立代理
// 建立一個session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopeProxyMode.TARGET_CLASS)
public A a{ …… }
在XML中開啟物件代理
<!-- 開啟java動態代理--> <bean id="xxx" class="com.xxx.xxx" scope="session"> <aop:scoped-proxy /> </bean>
<!-- 開啟Cglib代理-->
<bean id="xxx" class="com.xxx.xxx" scope="session">
<aop:scoped-proxy proxy-target-class="false" />
</bean>