[面試原題]web
Spring中定義bean的做用域時,使用singleton和prototype有何區別?面試
[正確答案]spring
singleton做用域:當把一個Bean定義設置爲singleton做用域時,Spring IoC容器中只會存在一個共享的Bean實例,而且全部對Bean的請求(將其注入到另外一個Bean中,或者以程序的方式調用容器的getBean()方法),只要id與該Bean定義相匹配,則只會返回該Bean的同一實例,能夠理解爲單例模式。session
prototype做用域:prototype做用域的Bean會致使在每次對該Bean請求時都會建立一個新的Bean實例。框架
[面試技術點]測試
Spring bean定義的做用域概念。prototype
[解讀]code
小博老師用一個簡單的例子說明singleton與prototype的區別。對象
好比有一個User類定義以下:作用域
Spring配置文件中bean的定義以下:
測試用例代碼以下:
執行結果爲:
User is initialized.
若是把bean的scope修改成prototype:
再次運行測試用例,結果爲:
User is initialized.
User is initialized.
從上面的例子能夠看出,當bean的scope配置爲singleton的時候,經過spring context獲取bean的實例,只會初始化一次。也就說明singletone是單例模式。
當bean的scope配置爲prototype時,經過spring context獲取bean的實例,每次都會初始化,也就是說每次都新建了一個對象。
[擴展]
Spring框架支持如下五種bean的做用域:
singleton: bean在每一個Spring IoC 容器中只有一個實例。
prototype:一個bean的定義能夠有多個實例。
request:每次http請求都會建立一個bean,該做用域僅在基於web的Spring ApplicationContext情形下有效。
session:在一個HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。
global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的做用域是singleton。