官术网_书友最值得收藏!

2.4.1 把握Bean的作用域

在介紹Setter方法注入時,我們已經(jīng)提到了Spring中的Bean作用域的概念。作用域描述了Bean在Spring IoC容器上下文中的生命周期和可見性。在這里,我們將討論Spring框架中不同類型的Bean作用域及其在使用上的指導(dǎo)規(guī)則。

如果想要通過注解來設(shè)置Bean的作用域,可以使用如代碼清單2-26所示的示例代碼。

代碼清單2-26 設(shè)置Bean作用域示例代碼

@Configuration
public class AppConfig {
    @Bean
    @Scope("singleton")
    public HealthRecordService createHealthRecordService() {
        return new HealthRecordServiceImpl();
    }
}

可以看到這里使用了一個@Scope注解來指定Bean的作用域?yàn)閱卫膕ingleton。在Spring中,除了單例作用域之外,還有一個prototype,即原型作用域,也可以稱之為多例作用域,以與單例作用域進(jìn)行區(qū)別。使用方式上,我們同樣可以使用如代碼清單2-27所示的枚舉值來對它們進(jìn)行設(shè)置。

代碼清單2-27 通過枚舉值設(shè)置作用域代碼

@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

在Spring IoC容器中,Bean的默認(rèn)作用域是單例,也就是說不管有多少個對Bean的引用,容器只會創(chuàng)建一個實(shí)例。而原型作用域則不同,每次請求Bean時,Spring IoC容器都會創(chuàng)建一個新的對象實(shí)例。

從兩種作用域的效果而言,我們總結(jié)出一條開發(fā)上的經(jīng)驗(yàn),即對于有狀態(tài)的Bean,我們應(yīng)該使用原型作用域,反之則應(yīng)該使用單例作用域。

那么,什么樣的Bean是有狀態(tài)的呢?結(jié)合Web應(yīng)用程序,我們可以明確對于每次HTTP請求而言,我們都應(yīng)該創(chuàng)建一個Bean來代表這一次的請求對象。同樣,對于會話而言,我們也需要針對每個會話創(chuàng)建一個會話狀態(tài)對象。這些都是常見的有狀態(tài)的Bean。為了更好地管理這些Bean的生命周期,Spring還專門針對Web開發(fā)場景提供了對應(yīng)的request和session作用域。

主站蜘蛛池模板: 新竹市| 伊通| 资中县| 阳山县| 贵定县| 肥乡县| 青阳县| 宁德市| 天长市| 英山县| 新田县| 大新县| 双牌县| 巴彦淖尔市| 道真| 河池市| 万安县| 昔阳县| 江川县| 上饶县| 江达县| 治县。| 江西省| 永登县| 理塘县| 磐石市| 龙胜| 浮梁县| 富平县| 洞头县| 荣昌县| 怀安县| 金门县| 清镇市| 仙居县| 喜德县| 容城县| 二连浩特市| 雷州市| 牟定县| 乌拉特后旗|