天天看點

Spring Bean的作用域Spring中Bean的4大作用域

Spring中Bean的4大作用域

單例 Singleton     

  在整個應用中隻建立一個bean執行個體,Spring中都bean預設都是單例都,也就是說不管你在任何地方,以任何方式注入,裝配都是同一個Bean對象。 單例的Bean 初始化,和回收都是小成本,但是當我們都類是易變都時候,你會發現Bean很容易被污染。影響我們後續使用。

原型 Prototype

 每次注入,或者通過Spring應用上下文擷取的時候,都會建立一個新的bean執行個體。想要聲明一個Prototype作用域 ,可以在Bean聲明都時候指定@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)   當然你也可以使用@Scope("prototype") 但是我認為前者較為安全,不易錯。

同時你也可以在xml聲明Bean的時候使用scope屬性指定prototype 

<bean id="ID值"  class="全限定類名" scope="prototype" >  

但是這種使用場景較少。

會話 Session 

在Web應用中,每個會話建立一個bean執行個體,就會話域而言,有一個特别合适的例子,購物車Bean 。 

聲明Session域Bean的時候加上@Scope(value="WebApplicationContext.SCOPE_SESSION",proxyMode="ScopedProxyMode.INTERFACES") 

你也可以使用中聲明

<bean id="" class="" scope="session">

<aop:scoped-proxy  proxy-target-class="false">           (使用aop的命名空間需要在XML配置中聲明)

</bean>

相比之前的聲明方式 多了一個proxyMode,我們詳細介紹一下這個proxyMode 他是用來指定bean的代理方式(基于接口或者類)

他解決了session或者request注入到singleton時所産生的問題。singleton是從Spring上下午加載的時候建立,但是這時候ession和request還沒有被建立,他們隻有在第一次請求來的時候才會被建立,是以spring會代理,當調用的時候會委托真正的對象。

而proxyMode的值就是指定這個類是基于接口代理還是基于類代理CGLib。 

@Scope(value="WebApplicationContext.SCOPE_SESSION",proxyMode="ScopedProxyMode.INTERFACES")    基于接口

@Scope(value="WebApplicationContext.SCOPE_SESSION",proxyMode="ScopedProxyMode.TARGET_CLASS")  基于類

<aop:scoped-proxy >  預設基于CGlib代理。 指定proxy-target-class="false"基于接口代理

請求 Request

在web應用中,為每個請求建立一個bean執行個體,

聲明方式與Session一樣 指定值為

@Scope(value="WebApplicationContext.SCOPE_REQUEST",proxyMode="ScopedProxyMode.INTERFACES")