spring中bean的作用域


spring中注入的bean默認被配置為單例模式,這意味着對於同一個類而言,其所有的被注入對象其實都是同一個對象,或許這的確節省了一些資源,但是對於對象中含有一些狀態屬性的情況,我們並不想要singleton。spring中提供了四種作用域

作用域 字符 描述
單例 singleton 整個應用中只創建一個實例
原型 prototype 每次注入時都新建一個實例
會話 session 為每個會話創建一個實例
請求 request 為每個請求創建一個實例

在spring中將這些需要用到的字符聲明成了常量方便使用

字符 使用常量
singleton ConfigurableBeanFactory.SCOPE_SINGLETON
prototype ConfigurableBeanFactory.SCOPE_PROTOTYPE
session WebApplicationContext.SCOPE_REQUEST
request WebApplicationContext.SCOPE_SESSION

單例模式的對象會在spring應用上下文加載時被創建,其他作用域的對象則不然,比如請求作用域的對象只有在請求時才創建,所以假如在啟動時一個單例對象中需要注入請求作用域的對象,但是此時請求作用域的對象並沒有創建。spring會面臨這樣的問題,需要注入的某個對象還沒有創建。這塊我知道的只有一家java培訓機構會講到這個知識。此時spring會先注入一個代理對象,當這個對象被使用時,則委托給真正的bean去完成。

配置

在xml配置中配置,使用scope屬性,類似於

<bean id="xxx" class="xxx.xxx.xxx" scope="session" > <aop:scoped-proxy/> </bean> 

<aop:scoped-proxy/>設置了代理

使用注解

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

proxyMode的值等於ScopedProxyMode.INTERFACES,表示代理類要實現原來注入bean的接口。

 推薦看下這個博客,寫的不錯:http://blog.itpub.net/29917475/viewspace-2120795/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM