Spring Bean的5種作用域
singleton作用域:
Spring的scope的默認值是singleton
Spring 只會爲每一個bean創建一個實例,並保持bean的引用.
<bean id="bean的id" class="bean的包名.類名" cope="singleton"/> 或
<bean id="bean的id" class="bean的包名.類名" singleton="true"/>
Spring1以上提供
prototype作用域:
每一次請求(將其注入到另一個bean中,或執行getBean()方法)都會產生一個新的bean實例,相當於new操作.
Spring一旦將Bean實例交給(注入)調用者,就不再持有這個bean的引用。就無法再執行bean定義的destroy-method.
清除prototype作用域的bean對象並釋放資源,是調用者的職責。
<bean id="bean的id" class="bean的包名.類名" cope="prototype"/> 或
<beanid="bean的id" class="bean的包名.類名" singleton="false"/>
Spring1以上提供
request作用域:
表示該針對每一次HTTP請求都會產生一個新的bean,僅適用於WebApplicationContext環境。
<bean id="bean的id" class="bean的包名.類名" scope="request"/>
Spring1以上提供
session作用域:
表示該針對每一次HTTP請求都會產生一個新的bean,僅適用於WebApplicationContext環境。
<bean id="bean的id" class="bean的包名.類名" scope="session"/>
Spring1以上提供
globalSession作用域:
它僅僅在基於portlet的web應用中才有意義。Portlet規範定義了全局Session的概念,它被所有構成某個portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定於全局portlet Session的生命週期範圍內。如果你在web中使用global session作用域來標識bean,那麼,web會自動當成session類型來使用。
<bean id="bean的id" class="bean的包名.類名" scope="globalSession"/>
Spring1以上提供
Web環境作用域的特殊配置:
使用request作用域、request作用域、globalSession作用域還需要進行額外的配置
在低版本的Web容器中(Servlet2.3以前),需要使用過濾器進行配置
Xml代碼
<web-app>
...
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> </filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
</web-app>
在高版本的Web容器中,可以使用監聽器進行配置
Xml代碼
<web-app>
...
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
...
</web-app>
混合使用作用域的問題:
a Bean是Request作用域,它要被一個singleton作用域的b Bean使用(被注入)。還要使用<aop:sclped-proxy/>配置。
<beans xmlns="..."
...
xmlns:aop="....." 要引入aop命名空間
>
<bean id="a" class="A" scope="request">
<aop:sclped-proxy/>
</bean>
<bean id="b" class="B" scope="singleton">
<property name="a" ref="a"/>
</bean>