1. 程式人生 > 其它 >Spring速查手冊(二)——Bean的作用域

Spring速查手冊(二)——Bean的作用域

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>