在默認情況下冰评,Spring應用上下文中所有的bean都是以單例的形式創(chuàng)建的琼娘。
1.spring定義了多種作用域阅悍,可以基于這些作用域創(chuàng)建bean,包括
(1).單例:在整個應用中弦撩,值創(chuàng)建bean的一個實例步咪。是spring默認的作用域。
(2).原型:每次注入或者通過spring應用上下文獲取的時候益楼,都會創(chuàng)建一個新的bean的實例猾漫。
(3).會話:在web應用中,會為每個會話創(chuàng)建一個bean實例感凤。
(4).請求:在web應用中悯周,為每個請求創(chuàng)建一個bean實例。
2.如果需要指定除單例外的其他作用域陪竿,需要使用@Scope注解禽翼,形式如下:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
如果使用XML來配置的話,可以使用<bean>元素的scope屬性來設置作用域族跛。
3.使用會話和請求作用域
假設我們在淘寶購物闰挡,購物車如果是單例的,那么所有人的商品都會被添加到同一個購物車礁哄。如果是原型的解总,那么再其他的地方就不可以使用,所以此時我們可以考慮會話作用域姐仅。
再來了解一下ScopeProxyMode這個枚舉類花枫,具體如下顯示
可以看出里面有四種選擇,分別是DEFAULT,NO,INTERFACE,TARGET_CLASS掏膏。
我們再來看一下WebApplicationContext接口劳翰,如下圖所示:
從上面我們可看出有多種SCOPE的作用域,而且WebApplicationContext接口繼承了ApplicationContext接口馒疹,下圖是ApplicationContext接口的定義:
Spring是沒有辦法創(chuàng)建基于接口的代理佳簸。它必須使用CGLib來生成基于類的代理。所以颖变,如果bean類型是具體類的話生均,我們必須要將proxyMode屬性設置為ScopeProxyMode.TARGET_CLASS,以此來表明要以生成目標類擴展的方式創(chuàng)建代理腥刹。
上面看了一下bean作用域的注解方式马胧,接下來看看bean的作用域的xml配置方式:
(1)<bean>元素有scope屬性,通過scope來配置bean的作用域衔峰。
(2)spring會為bean創(chuàng)建一個作用域代理佩脊,默認情況下蛙粘,它會使用CGLib創(chuàng)建目標類的代理。也可以通過設置proxy-target-class屬性設置為false威彰,來生成基于接口的代理出牧。使用<aop:scoped-proxy>,要使用這個元素歇盼,必須在XML的beans根元素中聲明該命名空間舔痕。