經典Java面試題-Spring bean 做用域

[面試原題]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。

相關文章
相關標籤/搜索